vue-electron中修改表格内容并修改样式以及页边距和打印

需求

将表格导入并向其添加内容,然后导出表格,且表格样式(一般是值宽高合并颜色等)不能改变。

技术

  • electron
  • xlsx
  • xlsx-style
  • node-xlsx

javascript yarn add xlsx yarn add xlsx-style yarn add node-xlsx

xlsx-style

xlsx-style 的一些源码修改是根据网上一些博主的文章来的。如下所示:

使用xlsx-style 的时候要注意,使用的是会报错误,所以,我们需要改他的源码,下面是正确的修改方式,代码如下(示例)

```javascript

第一步 修改nod_modules 里面xlsx-style文件夹下面dist文件夹下的cpexcel.js文件

807: var cpt = cptable;

第二步 修改xlsx-style文件夹下面ods.js文件

10: return require('./' + 'xlsx').utils; 12: try { return require('./' + 'xlsx').utils; }

第三步 修改xlsx-style文件夹下面的xlsx.js文件 替换writewsxml_data以下方法

var DEFPPI = 96, PPI = DEFPPI; function px2pt(px) { return px * 96 / PPI; } function pt2px(pt) { return pt * PPI / 96; } function writewsxmldata(ws, opts, idx, wb) { var o = [], r = [], range = safedecoderange(ws['!ref']), cell, ref, rr = "", cols = [], R, C,rows = ws['!rows']; for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encodecol(C); for(R = range.s.r; R <= range.e.r; ++R) { r = []; rr = encoderow(R); for(C = range.s.c; C <= range.e.c; ++C) { ref = cols[C] + rr; if(ws[ref] === undefined) continue; if((cell = writewsxmlcell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell); } if(r.length > 0){ params = ({r:rr}); if(rows && rows[R]) { row = rows[R]; if(row.hidden) params.hidden = 1; height = -1; if (row.hpx) height = px2pt(row.hpx); else if (row.hpt) height = row.hpt; if (height > -1) { params.ht = height; params.customHeight = 1; } if (row.level) { params.outlineLevel = row.level; } } o[o.length] = (writextag('row', r.join(""), params)); } } if(rows) for(; R < rows.length; ++R) { if(rows && rows[R]) { params = ({r:R+1}); row = rows[R]; if(row.hidden) params.hidden = 1; height = -1; if (row.hpx) height = px2pt(row.hpx); else if (row.hpt) height = row.hpt; if (height > -1) { params.ht = height; params.customHeight = 1; } if (row.level) { params.outlineLevel = row.level; } o[o.length] = (writextag('row', "", params)); } } return o.join(""); }

```

打印页边距以及打印功能修改源码

node_modules里找到xlsx-style 找到 xlsx.js 搜索关键词

增加缩放,设置纵横向 设置打印纸张大小 功能 搜索关键词 write_ws_xml_pagesetup 把此函数改为

```javascript // 打印属性设置 function writewsxml_pagesetup(setup) { var pageSetup = writextag('pageSetup', null, { paperSize: setup.pagesize || "9", // 纸张大小 9为A4纸 scale: setup.scale || '100', // 缩放大小 orientation: setup.orientation || 'portrait', // 纸张方向 landscape 为横向 portrait 为纵向 horizontalDpi : setup.horizontalDpi || '4294967292', verticalDpi : setup.verticalDpi || '4294967292' }) return pageSetup; }

```

搜索关键字 write_ws_xml 替换为

```javascript function writewsxml(idx, opts, wb) { var o = [XMLHEADER, WSXML_ROOT]; var s = wb.SheetNames[idx], sidx = 0, rdata = ""; var ws = wb.Sheets[s]; if(ws === undefined) ws = {}; var ref = ws['!ref']; if(ref === undefined) ref = 'A1'; o[o.length] = (writextag('dimension', null, {'ref': ref}));

var sheetView = writextag('sheetView', null,  {
  showGridLines: opts.showGridLines == false ? '0' : '1',
  tabSelected: opts.tabSelected === undefined ? '0' :  opts.tabSelected,
  workbookViewId: opts.workbookViewId === undefined ? '0' : opts.workbookViewId
});
o[o.length] = writextag('sheetViews', sheetView);

if(ws['!cols'] !== undefined && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));
o[sidx = o.length] = '<sheetData/>';
if(ws['!ref'] !== undefined) {
  rdata = write_ws_xml_data(ws, opts, idx, wb);
  if(rdata.length > 0) o[o.length] = (rdata);
}
if(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace("/>",">"); }

if(ws['!merges'] !== undefined && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));

if (ws['!margins'] !== undefined) o[o.length] =  write_ws_xml_margins(ws['!margins']); // 页边距 !!! 必须要先设置页边距

if (ws['!pageSetup'] !== undefined) o[o.length] =  write_ws_xml_pagesetup(ws['!pageSetup']); // 缩放 纵横向
if (ws['!rowBreaks'] !== undefined) o[o.length] =  write_ws_xml_row_breaks(ws['!rowBreaks']);
if (ws['!colBreaks'] !== undefined) o[o.length] =  write_ws_xml_col_breaks(ws['!colBreaks']);

if(o.length>2) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace("/>",">"); }
return o.join("");

}

```

增加页边距设置 搜索关键词 write_ws_xml_pagesetup 在此函数下方 增加如下两个函数

```javascript function writewsxmlmargins(margin) { let margin2 = defaultmargins(margin); return writextag('pageMargins', null, margin2); } function default_margins(margins, mode) { if(!margins) return; var defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3]; if(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5]; if(margins.left == null) margins.left = defs[0]; if(margins.right == null) margins.right = defs[1]; if(margins.top == null) margins.top = defs[2]; if(margins.bottom == null) margins.bottom = defs[3]; if(margins.header == null) margins.header = defs[4]; if(margins.footer == null) margins.footer = defs[5]; return margins }

```

在 write_ws_xml 函数里增加 调用 ,在上方 ““增加缩放,设置纵横向 设置打印纸张大小 功能”” 功能里 已经增加过了 注意 页边距 必须在缩放之前设置 不然会导致导出错误!!!

```javascript if (ws['!margins'] !== undefined) o[o.length] = writewsxml_margins(ws['!margins']); // 页边距 !!! 必须要先设置页边距

```

全部代码

upload方法分析

  • 通过pdfWord.testImage()读取到表格(node环境),然对list数据里面的表格进行内容的修改以及填充,修改内容以后就将其样式调整以及转换数据类型并下载

```javascript testImage() { const a2 = path.join('C:\Users\op\Desktop', '副本.xlsx') const sheets = xlsx.parse(a2);

//读取xlxs的sheet1 
const sheetData = sheets[0].data;

return sheets[0].data;

}, ```

  • openDownloadDialog 下载
  • sheet2blob 将样式修改后的表格转为blob格式
  • xlsxAddStyle 修改样式 其他的属性大家可以看文档即可看明白,我只能大家说一下三个自认为比较重要的东西 1."!cols"(代码中:sheet["!cols"])= 指每列单元格一列的宽度,按先后顺序排列 2."!rows"(代码中:sheet["!rows"])= 指每行单元的一行的高度,按先后顺序排列 3."!merges"(代码中:sheet["!merges"])= 指合并;没有先后顺序。s:开始 e:结束 r:列 c:行 以上三种都是可以让用户自己控制的属性,至于其他的就需要你们根据自己的需求进行调整了

在修改样式中我们会看到element一个变量;他们可以去打印这个变量查看其中的属性;你们可以到时里面有许多样式结构,你只需要根据自己想要的去修改即可。

```javascript

主要按钮

```

今天的内容到这里就结束了。

如果您喜欢我的文章或者该文章对你有帮助,您也可以关注我的公众号:【前端雾恋

往期文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值