时间:2021-07-01 10:21:17 帮助过:4人阅读
Excel
导出思路参考文章 - angularjs使用指令实现table导出csv
项目中使用到了导出Excel
功能,潘老师已经在博客中将表格导出为csv
的技术难点实现,剩下的,只是根据实际的业务需求对该指令进行完善。
大体遇到了以下几个问题:
因为原指令默认导出表格所有的内容,第一次直接导出时,发现直接将查看、编辑这几个按钮的HTML
代码都导出去了,我们要的应该是人员信息和人员资质信息。
指令添加参数:有效数据列数。
如图,这里的有效数据列就是市、区县等等一直到有效期至,一共15
列,作为参数传给导出指令。
self.exportCols = scope.exportCols; for (let i = 0; i < table.rows.length; i ++) { // 获取每行的数据 var rowData = table.rows[i].cells; // 如果该列为正常列,循环内容 for (let j = 0; j < self.exportCols; j ++) { // 如果该列不存在,则赋值为空内容 var data = rowData[j] === undefined ? '' : rowData[j].innerHTML; // 拼接内容,用逗号分隔 csvString = csvString + data + ","; } // 删除最后多余的逗号 csvString = csvString.substring(0, csvString.length - 1); // 每行末尾添加\n进行换行 csvString = csvString + "\n"; }
原来内层循环的是所有数据列,现在改成传入的有效数据列数。
以这个图为例,第一行是有15
列的,但是第二行的数据只有4
列,因为其余的列是第一行设置rowspan
显示的,实际上第二行的tr
中只有人员资质4
个td
。
这就导致导出的时候第二行只有四个数据,并且是从左对齐的,所以我们需要在跨行的列添加空数据。
加一个条件判断,传入出现被跨行的列时剩余列的长度,用于区分是正常列还是被跨行的列。
if (self.isNormalItem(rowData)) { // 如果该列为正常列,循环内容 for (let j = 0; j < self.exportCols; j++) { // 如果该列不存在,则赋值为空内容 var data = rowData[j] === undefined ? '' : rowData[j].innerHTML; // 拼接内容,用逗号分隔 csvString = csvString + data + ","; } } else { // 根据有效数据中的跨行列拼接空数据 for (let j = 0; j < self.multipleRowCols; j ++) { csvString = csvString + ","; } // 根据有效数据减去跨行列,获得非跨行列,并拼接数据 for (let index = 0; index < self.exportCols - self.multipleRowCols; index ++) { csvString = csvString + rowData[index].innerHTML + ","; } }
因为这里需要为添加资格证按钮添加一个空列,导出的时候也会出现空列,效果并不好。
所以需要进行判断,当出现被跨行的列时,需要判断它的上一行的最后四项内容是否为空,如果为空,就应该把这个列的内容放到上一行。
if (self.isNormalItem(rowData)) { // 如果该列为正常列,循环内容 ... } else if (self.isFirstItem(csvString)) { // 如果当前跨行资质是当前人员的第一个资质,则将该资质添加到上一行 // 因为能添加人员资质的界面第一行的人员资质是空的,所以需要将该资 // 质添加到上一行 csvString = self.addDataToPreString(rowData, csvString); } else { // 根据有效数据中的跨行列拼接空数据 ... }
再加一个else
,如果当前被跨行的列是当前人员的第一个人员资质的话,就把这一行的人员资质数据添加到上一行人员资质的空白处。
下面是方法的具体实现:
// 判断当前表格中资质是否是第一项资质 self.isFirstItem = function(string) { // 分隔字符串 var csvArray = string.split(','); // 循环已有字符数组的倒数四个元素,判断是否有效 for (var i = csvArray.length - 1; i >= csvArray.length - 4; i--) { if (self.isValid(csvArray[i])) { return false; } } return true; }; // 判断当前字符是否有效 // 空字符和\n视为无效 self.isValid = function(char) { if (char === '' || char === '\n') { return false; } else { return true; } }; // 添加数据到字符串的上一行 self.addDataToPreString = function(data, string) { // 字符串分隔为数据 var csvArray = string.split(','); // 循环,将有效的数据添加到上一行 for (let i = 0; i < self.validNoMultipleRowCols; i++) { csvArray[csvArray.length - self.validNoMultipleRowCols + i] = data[i].innerHTML; } // 数组转换为字符串 return csvArray.join(','); };
最终实现导出的csv
效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
AngularJS 文档阅读的指令scope
以上就是AngularJS导出Excel指令的详细内容,更多请关注Gxl网其它相关文章!