vue使用xlsx、xlsx-style和fileSaver导出excel表格

本文引用
xlsx-style坑记录
Vue使用xlsx和xlsx-style纯前端导出带样式的Excel
vue导出Excel表格,报错utils of undefined 是版本原因

前期准备工作

  • 安装xlsx npm i -S xlsx
  • 安装xlsx-style npm i -S xlsx-style
  • 安装fileSaver npm i -S file-saver

过程中遇到的报错

这里的报错就我遇到的来说一说吧

utils of undefined

需要切换一下xlsx版本 npm install --save xlsx@0.17.0

Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx

在vue.config.js中添加这样一串代码

  configureWebpack: {
    externals: {
      './cptable': 'var cptable'
    },
  },

这个问题的话,网上的博客还是很多的

Can’t resolve ‘fs’

这个问题困扰了我很久,只要在vue.config.js中进行配置即可,还是在刚刚创建的configureWebpack中添加

  configureWebpack: {
    resolve: {
      fallback: {
        fs: false
      }
    },
    externals: {
      './cptable': 'var cptable'
    },
  },

jszip not a constructor

需要在node_modules中找到相应的文件进行修改

node_modules\xlsx-style\xlsx.js (1339行左右)if(typeof jszip === 'undefined') jszip = require('./js'+'zip').JSZip;
替换成
if(typeof jszip === 'undefined') jszip = require('./jszip.js');


以上的话是解决了我在使用这些插件时出现的问题,如果还有其他的问题,也欢迎补充


只使用xlsx也可以实现excel表格的导出,但是它只能做一些简单的单元格长宽的设置,以及单元格合并,其他复杂一点的样式,如居中、字体等就需要使用xlsx-style,在使用xlsx-style时还需要使用file-saver

只使用xlsx导出的案例

        exportExcel() {
            let data = [["这是一个表格"], ["时间", "姓名", "地址"]];
            this.tableData.forEach(r => {
                let rowData = [];
                rowData = [r.date, r.name, r.address]
                data.push(rowData)
            })  // 处理数据

            let ws = XLSX.utils.aoa_to_sheet(data);  // 将数据放到放到表格中

            ws['!merges'] = [XLSX.utils.decode_range('A1:C1')] // 合并单元格
            ws['!cols'] = [{ // 设置单元格宽度
                wpx: 120
            }, {
                wpx: 100
            }, {
                wpx: 100
            }]
            ws["!rows"]=[{ // 设置单元格高度
                hpx:50
            }]
            let wb = XLSX.utils.book_new()
            XLSX.utils.book_append_sheet(wb, ws, "sheet1")
            XLSX.writeFile(wb, "表格下载.xlsx") // 导出
       }

这样一个使用xlsx导出excel表格的方法就定义好了

使用xlsx、xlsx-style、file-saver

        exportExcel() {
            let data = [["这是一个表格"], ["时间", "姓名", "地址"]];
            this.tableData.forEach(r => {
                let rowData = [];
                rowData = [r.date, r.name, r.address]
                data.push(rowData)
            })  // 处理数据

            let ws = XLSX.utils.aoa_to_sheet(data);  // 将数据放到放到表格中

            ws['!merges'] = [XLSX.utils.decode_range('A1:C1')] // 合并单元格
            ws['!cols'] = [{ // 设置单元格宽度
                wpx: 120
            }, {
                wpx: 100
            }, {
                wpx: 100
            }]
            ws["!rows"]=[{ // 设置单元格高度
                hpx:50
            }]
            for (let key in ws) {
                if (ws[key] instanceof Object) {
                    ws[key].s = {
                        alignment: {
                            horizontal: 'center', // 水平居中
                            vertical: 'center' // 垂直居中
                        },
                        font: {
                            sz: 10, // 字号
                            name: '宋体' // 字体
                        },
                        border: {  // 边框
                            top: {
                                style: 'thin'
                            },
                            bottom: {
                                style: 'thin'
                            },
                            left: {
                                style: 'thin'
                            },
                            right: {
                                style: 'thin'
                            }
                        }
                    }
                }
            }
            let wb = XLSX.utils.book_new()
            XLSX.utils.book_append_sheet(wb, ws, "sheet1")
            // 导出Excel, 注意这里用到的是XLSXS对象
            let wbout = XLSXS.write(wb, {
                bookType: 'xlsx',
                bookSST: false,
                type: 'binary'
            })
            FileSaver.saveAs(
                new Blob([this.s2ab(wbout)], {
                    type: 'application/octet-stream'
                }),
                "表格下载.xlsx"
            )
        },
        s2ab(s) {
            var buf = new ArrayBuffer(s.length)
            var view = new Uint8Array(buf)
            for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
            return buf
        },

另外使用xlsx-style还可以设置单元格的其他的格式,可以参考这篇文章,很全。
JavaScript导出excel文件,并修改文件样式


在导出的过程中,使用xlsx-style时出现了很多的问题,解决起来的确很头疼,不过好像听说这个插件已经是五六年前的了,很久没有更新过了,最近再看看还有没有其他好的方法用用吧

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
要修改导出Excel 表格的字体颜色,你可以使用 xlsx-style 库提供的 `XLSXStyle` 类的 `createStyle` 方法来创建自定义样式,然后将其应用到单元格中。 下面是一个使用 Vue 3 + TypeScript 和 xlsx-style-vite 库的示例代码: ```typescript <template> <div> <button @click="exportExcel">导出 Excel</button> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { utils, writeFile } from 'xlsx-style-vite'; import { XLSXStyle } from 'xlsx-style-vite/xlsx-style'; export default defineComponent({ methods: { exportExcel() { const data = [ ['姓名', '年龄', '性别'], ['张三', 18, '男'], ['李四', 20, '女'], ['王五', 22, '男'] ]; const workbook = utils.book_new(); const worksheet = utils.aoa_to_sheet(data); // 创建自定义样式 const style = XLSXStyle.createStyle({ font: { color: '#FF0000' } }); // 将样式应用到单元格 utils.sheet_set_cell_style(worksheet, 'A1:C1', style); utils.book_append_sheet(workbook, worksheet, 'Sheet1'); writeFile(workbook, 'example.xlsx'); } } }); </script> ``` 在上面的代码中,我们首先创建了一个包含一些数据的数组 `data`。然后,我们使用 `utils.aoa_to_sheet` 方法将该数组转换为一个工作表对象。接着,我们使用 `XLSXStyle.createStyle` 方法创建了一个包含字体颜色为红色的自定义样式,并使用 `utils.sheet_set_cell_style` 方法将该样式应用到了表头行的所有单元格上。最后,我们将工作表对象添加到工作簿中,使用 `writeFile` 方法将工作簿导出为一个 Excel 文件。 需要注意的是,在使用 xlsx-style-vite 库时,要使用 `XLSXStyle` 类来创建自定义样式,这与原生的 xlsx-style 库有所不同,所以要引入 `xlsx-style-vite/xlsx-style` 模块。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值