Html table 实现Excel多格粘贴

电商网站的后台总少不了各种繁杂数据的录入,旁边的运营妹子录完第138条商品的时候,终于忍不住转身吼到:为什么后台的录入表不能像Excel那样多行粘贴!!!于是,就有了这片文章~

实现的就是这样的一个效果,从Excel或Number复制好多行数据后,直接在table起始单元格按下C+V,表格数据立马就齐刷刷站好位了!强迫症表示看着好爽感!



简单到不行的原理:给表格元素绑定粘贴事件,做到这四件事就可以啦(案例代码依赖jquery框架):

  1. 消除默认粘贴事件

    e.preventDefault();
  2. 获取粘贴板上的数据

    var data = null;
    var clipboardData = window.clipboardData || e.originalEvent.clipboardData; // IE || chrome
    data = clipboardData.getData('Text');

    复制出来的数据是用制表符\t和换行符\n隔开的数据,显示出来是带空格的一系列字符串,如果在调试时想要清楚的查看带\t,\n的字符串,可以把字符串\t\n替换成成\\t \\n:

  3. 通过制表符和换行符解析数据,先通过换行符将不同行数组分开成数组,再把每个单元格数据通过制表符分开,同样构造成数组。

//解析数据
var arr = data.split('\n')
.filter(function(item) { //兼容Excel行末\n,防止出现多余空行
return (item !== "")
}).map(function(item) {
return item. split("\t");
});
//最终数据模式
[
[a0,a1,a2],//row1
[b0,b1,b2],//row2
[c0,c1,c2],//row3
]
  1. 把解析好的数据放在相应单元格
var tab = this;  //表格DOM
var td = $(e.target).parents('td'); //起始单元格
var startRow = td.parents('tr')[0].rowIndex; //起始单元格行数
var startCell = td[0].cellIndex; //起始单元格列数
var rows = tab.rows.length; //总行数
for (var i = 0; i < arr.length && startRow + i < rows; i++) {
var cells = tab.rows[startRow + i].cells.length; //该行总列数
for(var j = 0; j < arr[i].length && startCell + j < cells; j++) {
var cell = tab.rows[startRow + i].cells[startCell + j];
$(cell).find(':text').val(arr[i][j]); //找到cell下的input:text,设置value
}
}

需要注意的是在进行行或列的循环时,除了判断循环数i/j小于复制数据的行/列数外,还要判断当前所在行/列是否小于表格的总行/列数;

最终实现的代码如下:

$('table').bind('paste', function(e) {
event.preventDefault(); //消除默认粘贴
//获取粘贴板数据
var data = null;
var clipboardData = window.clipboardData || e.originalEvent.clipboardData; // IE || chrome
data = clipboardData.getData('Text');
console.log(data.replace(/\t/g, '\\t').replace(/\n/g, '\\n')); //data转码
//解析数据
var arr = data.split('\n')
.filter(function(item) { //兼容Excel行末\n,防止出现多余空行
return (item !== "")
}).map(function(item) {
return item. split("\t");
});
//输出至网页表格
var tab = this; //表格DOM
var td = $(e.target).parents('td');
var startRow = td.parents('tr')[0].rowIndex;
var startCell = td[0].cellIndex;
var rows = tab.rows.length; //总行数
for (var i = 0; i < arr.length && startRow + i < rows; i++) {
var cells = tab.rows[startRow + i].cells.length; //该行总列数
for(var j = 0; j < arr[i].length && startCell + j < cells; j++) {
var cell = tab.rows[startRow + i].cells[startCell + j];
$(cell).find(':text').val(arr[i][j]); //找到cell下的input:text,设置value
}
}
});

只要把这一段绑在表格上,就可以华丽丽的实现多单元格复制啦~不过因为table单元格内的dom结构会有所差异,所以在循环内给单元格赋值时要留意下有没有问题。

小白一枚希望能够帮到大家~如果任何的小细节有更好更优雅的实现或编码方法,都希望大神们能在评论里指教,谢谢!

Html table 实现Excel多格粘贴的更多相关文章

  1. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

  2. javscript 导出html中的table到excel

    <script language="JavaScript" type="text/javascript"> /* * 默认转换实现函数,如果需要其他 ...

  3. excel单元格中批量加入固定字符

    excel单元格前怎么批量加字母 现在我要在联系人这列,每个姓名前加入衡阳的首字母简写(HY). 3 在同行上面随便找列,我找D列.输入公式:="HY"&A2. 5 输入后 ...

  4. 转载 NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  5. C# ASP.NET 读取EXCEL 单元格 读取 空值 不显示

    跟大家分享一下,[摘自]:http://blog.csdn.net/li185416672/article/details/8213729 读取excel时,某些单元格为空值 原来如此: 当我们用ol ...

  6. NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  7. Excel 单元格自定义格式技巧总结

    第一部分 Excel 中的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等:高级是因为利用 Excel 单元格的自定义格式 ...

  8. <转载>NPOI Excel 单元格背景颜色对照表

    我转载地址:http://www.holdcode.com/web/details/117 NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 ...

  9. C# 对Excel 单元格格式, 及行高、 列宽、 单元格边框线、 冻结设置

    一.对行高,列宽.单元格边框等的设置 这篇简短的文字对单元格的操作总结的比较全面,特此转载过来. private _Workbook _workBook = null; private Workshe ...

随机推荐

  1. Oracle和MSSQL查询有多少张表

    Oracle: SELECT count(*) FROM user_tables MSSQL: ) FROM sysobjects WHERE xtype='U' 这种方法可能会把dbo.dtprop ...

  2. Linux内核学习笔记1——系统调用原理【转】

    1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口.用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文 ...

  3. java基础(二十一)IO流(四)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  4. 关于ArrayList线程安全解决方案

    一:使用synchronized关键字 二:使用Collections.synchronizedList();使用方法如下: 假如你创建的代码如下:List<Map<String,Obje ...

  5. Linux Mono Asp.net 部署方案

    1.Jexus 国内的 官网:http://www.jexus.org 2.Apache 官网:http://mono-project.com/Mod_mono 3.Nginx 官网:http://m ...

  6. JavaScript高级程序设计25.pdf

    Text类型 文本类型由Text类型表示,包含纯文本内容,可以包含转义后的HTML字符,但不能包含HTML代码.Text节点具有以下特征: nodeType的值为3: nodeName的值为" ...

  7. iOS按钮长按

    UILongPressGestureRecognizer *longPressGR = [[UILongPressGestureRecognizer alloc] initWithTarget:sel ...

  8. 8-10-Exercise

    链接:第三次练习 A.ZOJ 3203  Light Bulb 这道题............哎~既可以用数学直接推导出来,也可以三分求,还可以二分求~~~~ NO1.数学公式 这种方法搞的不是很清楚 ...

  9. 在C#中如何确定一个文件是不是文本文件,以及如何确定一个文件的类型

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中如何确定一个文件是不是文本文件,以及如何确定一个文件的类型.

  10. POJ 1182 (经典食物链 /并查集扩展)

    (參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...