XLSX实现导出带样式的Excel表格的坑

XLSX导出带样式的Excel表格失败

项目的要求,需要导出一个结果到Excel表格中,因为所以,没有用Java的方式去实现,而选择了Vue前端直接导出的方式来实现。

开头总结:
使用xlsx-style的XLSX对象来生成Excel的对象才能实现样式,需要区分开xlsx包的XLSX对象

导入XLSX

网上有很多资料,基本上就是使用XLSX去实现Excel表格的创建

cnpm install --save xlsx

在导入XLSX后,如果要实现带样式的Excel表格,还需要再导入xlsx-style

cnpm install --save xlsx-style

注意:
导入xlsx-style时,在引用入vue后,启动时会抛出异常

import XLSX from "xlsx-style"
报错:This relative module was not found: ./cptable in ./node_modules/xlsx-style@0.8.13@xlsx-style/dist/cpexcel.js

需要手动导入JS,在node-modules中找到xlsx-style中的dist目录中的xlsx.full.min.js粘贴到static里
在这里插入图片描述
然后再在index.html中导入这个js

<script type="text/javascript" src="./static/xlsx.full.min.js"></script>

在这里插入图片描述
或者修改源码:

在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 
var cpt = require(./cpt’ + ‘able’); 
改成 
var cpt = cptable;

xlsx-style的使用

使用上诉方式导入后,若想实现在sheet参数中的添加的样式,例如:

sheet['B2'].s = {
        font: {
          name: '宋体',
          sz: 18,
          color: {rgb: 'ff0000'},
          bold: true,
          italic: false,
          underline: false
        },
        alignment: {
          horizontal: 'center',
          vertical: 'center'
        }
      }

只需要在将sheet对象转换为Excel对象的Blob格式时,使用XLSX --xlsx-style包中 进行转换即可,使用xlsx包中的只能生成无样式的excel!

/**
  * 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
  */
    sheet2blob: function (sheet, sheetName) {
      sheetName = sheetName || 'sheet1'
      var workbook = {
        SheetNames: [sheetName],
        Sheets: {}
      }
      workbook.Sheets[sheetName] = sheet
      // 生成excel的配置项
      var wopts = {
        bookType: 'xlsx', // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        type: 'binary'
      }
      var wbout = XLSX.write(workbook, wopts) // 这里的XLSX是上面手动导入的JS中的,是xlsx-style的XLSX
      var blob = new Blob([this.s2ab(wbout)], {type: 'application/octet-stream'})
      return blob
    },
    // 字符串转ArrayBuffer
    s2ab: function (wbout) {
      var buf = new ArrayBuffer(wbout.length)
      var view = new Uint8Array(buf)
      for (var i = 0; i !== wbout.length; ++i) view[i] = wbout.charCodeAt(i) & 0xFF
      return buf
    }

需要注意的是:XLSX这个参数,就是xlsx-style所属了!
如果还需要使用XLSX包中的一些函数,例如aoaToSheet等,那么导入的XLSX包不能引入为

import XLSX from "XLSX"

这样会导致上面手动在index.html中导入的xlsx-style冲突失效!!!

import XLSXD from "XLSX"

var sheet = XLSXD.utils.aoa_to_sheet(aoa)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要修改导出Excel表格中的字体颜色,可以使用 `xlsx-style` 库提供的 `createStyle` 方法,创建一个包含字体颜色信息的样式对象,然后将该样式对象应用到需要设置字体颜色的单元格上。 以下是一个示例代码: ```javascript import XLSX from 'xlsx-style'; import { writeFileSync } from 'fs'; const data = [ ['Name', 'Age', 'Gender'], ['Alice', 25, 'Female'], ['Bob', 30, 'Male'], ['Charlie', 35, 'Male'], ]; // 创建包含字体颜色的样式对象 const style = XLSX.utils.createStyle({ font: { color: { rgb: 'FF0000' } }, // 设置字体颜色为红色 }); // 将样式应用到第二行第一列的单元格 const cell = { s: { r: 1, c: 0 }, e: { r: 1, c: 0 } }; // 选取第二行第一列的单元格 const sheet = XLSX.utils.aoa_to_sheet(data); sheet[cell.s] = { ...sheet[cell.s], s: style }; // 应用样式单元格上 // 导出Excel文件 const book = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(book, sheet); const buffer = XLSX.write(book, { type: 'buffer' }); writeFileSync('output.xlsx', buffer); ``` 在上面的代码中,我们首先使用 `createStyle` 方法创建了一个样式对象,其中通过 `font.color.rgb` 属性设置了字体颜色为红色。然后,我们使用 `aoa_to_sheet` 方法将数据转换为工作表对象,选取第二行第一列的单元格,并将样式应用到该单元格上。最后,使用 `write` 方法将工作簿对象导出Excel文件。 需要注意的是,`xlsx-style` 库仅支持导出 `.xlsx` 格式的Excel文件,如果需要导出 `.xls` 格式的Excel文件,可以考虑使用其他库,如 `node-xlsx`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值