layui重写table的导出功能
⽬录
以前的项⽬中前端⽤的,那会选layui就是那会觉得样式还挺好看的,⽽且基本上需要的组件都有,尤其是⾃带table的导出和打印功能,不过table的导出功能还有点不⾜之处,导出后的⽂件直接查看没什么问题,要编辑或者编辑完成后上传进⾏预览还是问题挺多的,所以就重写了⼀下table的导出功能,特来mark⼀下。
重写这个功能借着了⼀个layui社区的插件,叫l,插件基于 xlsx.js 和 FileSaver,做了⼀个简单的封装,应付⽇常的的导出还是够⽤了,这⾥来记录⼀下步骤,主要就是在在table.js的源码中修改导出⽅法的逻辑,然后重新打包编译,替换本地的table.js。
1.下载layui的源码
下载需要修改源码的版本
2.重写portFile⽅法
2.1 下载excel插件
将excel.js移⾄layui源码的D:\soft\sentsin-layui-v2.5.4\layui\src\lay\modules下
2.2 layui.js中引⼊excel插件
2.3修改layui\src\lay\modules下的table.js⽂件
原来的导出逻辑是直接⽤⽂件流的输出⽅式⽣成csv或者xls⽂件,这⾥就是简单的判断了⼀下导出的类型,如果是xls类型就直接⽣成数据调⽤portExcel⽅法,如果是csv就还是直接调⽤原来的导出逻辑。
1//表格导出
2  portFile = function(id, data, type){
3    data = data || table.clearCacheKey(table.cache[id]);
4    type = type || 'csv';
5
6    var config = fig[id] || {}
7    ,textType = ({
8      csv: 'text/csv'
9      ,xls: 'application/vnd.ms-excel'
10    })[type]
11    ,alink = ateElement("a");
12
13    if(device.ie) ('IE_NOT_SUPPORT_EXPORTS');
14
15    alink.href = 'data:'+ textType +';charset=utf-8,\ufeff'+ encodeURIComponent(function(){
16      var dataTitle = [], dataMain = [];
17      layui.each(data, function(i1, item1){
18        var vals = [];
19        if(typeof id === 'object'){ //ID直接为表头数据
19        if(typeof id === 'object'){ //ID直接为表头数据
20          layui.each(id, function(i, item){
21            i1 == 0 && dataTitle.push(item || '');
22          });
23          layui.each(table.clearCacheKey(item1), function(i2, item2){
24            vals.push('"'+ (item2 || '') +'"');
25          });
26        } else {
27          table.eachCols(id, function(i3, item3){
layui下载28            if(item3.field && pe == 'normal' && !item3.hide){
29              i1 == 0 && dataTitle.push(item3.title || '');
30              vals.push('"'+ parseTempData(item3, item1[item3.field], item1, 'text') + '"');
31            }
32          });
33        }
34        dataMain.push(vals.join(','))
35      });
36
37      return dataTitle.join(',') + '\r\n' + dataMain.join('\r\n');
38    }());
39    /此处为修改部分/
40 //重写excel导出功能,采⽤excel插件
41    if(type=='xls'){
42  var dataTitle = [], dataMain = [], dataTotal = [];
43  layui.each(data, function(i1, item1){
44        var vals = [];
45        if(typeof id === 'object'){ //如果 id 参数直接为表头数据
46          layui.each(id, function(i, item){
47            i1 == 0 && dataTitle.push(item || '');
48          });
49          layui.each(table.clearCacheKey(item1), function(i2, item2){
50
51      //vals.push('"'+ (item2 || '') +'"');
52            vals.push(item2 || '');
53          });
54        } else {
55          table.eachCols(id, function(i3, item3){
56            if(item3.field && pe == 'normal' && !item3.hide){
57              var content = item1[item3.field];
58              if(content === undefined || content === null) content = '';
59
60              i1 == 0 && dataTitle.push(item3.title || '');
61              vals.push(parseTempData(item3, content, item1, 'text'));
62            }
63          });
64        }
65        dataMain.push(vals.join(','));
66      });
67    var export_data=[];
68    export_data[0]=dataTitle;
69    layui.each(dataMain, function(i4, item4){
70    export_data.push(item4.split(','))
71      });
72  portExcel({
73    sheet1: export_data
74  }, '导出临时表.xlsx', 'xlsx')
75 }else{
76  alink.download = (config.title || 'table_'+ (config.index || '')) + '.' + type;
77        document.body.appendChild(alink);
78        alink.click();
79        veChild(alink);
80 }
81
82  };
3.重新打包编译
3.1安装依赖
cd到layui⽂件夹下,npm install命令安装依赖
3.2全局安装gulp
gulp:npm install -g gulp
在layui项⽬⽬录下运⾏的命令,参考gulpfile.js中的备注
发⾏版命令:gulp完整任务命令:gulp all,过滤layim:gulp all --open
我使⽤的是gulp all --open
编译完成后将dist⽂件夹下内容替换为重新编译后的内容,建议全部替换或者替换layui.all.js、layui.js、table.js,加⼊excel,js即可。编译过程中遇到的问题
2.安装依赖的时候PhantomJS⽆法成功引⼊,⽤下⾯的这个命令可以解决
npm install phantomjs-prebuilt@2.1.16 --ignore-scripts

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。