Vue使用xlsx-style来实现导出excel表格的美化(居中对齐、字体等)

本来甲方需求只有实现excel的导出,并无导出excel表格的美化需求,所以使用xlsx库来实现excel的导出。后期对接得知需要对导出excel表格进行美化,因为xlsx只能导出excel表格并不能对其美化,所以通过查阅资料选择使用xlsx-style库来实现导出excel表格并对其美化。在使用xlsx-style库的过程中遇到了很多问题,所以写这篇文章记录一下。


首先需要安装三个依赖:

npm install xlsx --save
npm install xlsx-style --save
npm install file-saver --save

需要注意,在安装xlsx-style之后执行项目大概率会出现以下问题:

1.This relative module was not found:./cptable in ./node_modules/xlsx-style@0.8.13@xlsx-style/dist/cpexcel.js               解决方案为在vue.config.js中的module.exports添加如下代码:

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

2.Error: Can't resolve 'fs' in 'E:\\xlsx-style'                   解决方案为在本文上段代码中的configureWebpack配置项中添加如下代码:

resolve: {
      fallback:{
        fs: false,
      }
    },

3.BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.                解决方案:手动引入node-polyfill-webpack-plugin 插件。首先执行以下代码:

npm install node-polyfill-webpack-plugin
npm install crypto-browserify

然后修改vue.config.js中的配置代码,以下附上解决上文提到的1,2,3问题之后的完整代码,可以对比解决1,2问题之后添加了哪些代码:

const NodePolyfillPlugin = require("node-polyfill-webpack-plugin");
 
module.exports = {
  configureWebpack: {
    resolve: {
      fallback: {
        fs: false,
        crypto: require.resolve("crypto-browserify"),
        stream: require.resolve("stream-browserify"),
      },
    },
    plugins: [new NodePolyfillPlugin()],
  },
    externals: {
      './cptable': 'var cptable',
    },
};

错误和警告全部解决之后就可以成功执行项目,但是在成功执行项目下载并打开导出的excel文件时excel出现了提示,如下图:

其原因是因为项目中的合并单元格代码出现了问题,因为甲方提出的需求不涉及合并单元格,所以本文只是将这部分代码给注释掉,若是需要合并单元格功能可自行查阅资料解决(好吧,就是因为懒T.T)。


以下附上实现导出excel的函数完整代码:

exportToExcel(){
                      // 需要导出的数据
                      let excelData = [
                        ['幼儿园课表', null, null, null], // 标题
                        ['序号', '课程名称', '教师名称', '上课地点'], // 表头
                        ['1', '体育', '大头老师', '操场']
                      ]
                    
                      // 导出的excel文件名
                      const filename = '幼儿园课程表.xlsx'
                    
                      // Excel第一个sheet的名称
                      const ws_name = 'Sheet1'
                      const wb = XLSX.utils.book_new()
                      const ws = XLSX.utils.aoa_to_sheet(excelData)
                      XLSX.utils.book_append_sheet(wb, ws, ws_name) // 将数据添加到工作薄
                    
                    
                      // // 设置标题行单元格合并
                      // // s即start, e即end, r即row, c即column
                      // // 合并从--0行0列开始,到0行3列
                      // ws['!merges'] = [
                      //   { s: { r: 0, c: 0 }, e: { r: 0, c: 3 } }
                      // ]
                    
                      
                    
                    
                      /*
                        设置单元格其他样式
                        这里列举一部分,其他样式大同小异,自行网上搜索
                      */
                    
                      // 可以遍历全部单元格,进行样式设置
                      for (let i in ws) {
                        if (i === 'B1') {
                          ws[i].s = {
                            // 字体
                            font: {
                              name: '仿宋',
                              sz: 14,
                              bold: true
                            }
                          }
                        } else if (i === 'B2') {
                          ws[i].s = {
                            // 居中
                            alignment: {
                              horizontal: 'center',
                              vertical: 'center',
                              wrapText: true
                            }
                          }
                        } else if (i === 'B3') {
                          ws[i].s = {
                            // 单元格边框
                            border: {
                                top: {
                                  style: 'thin'
                                },
                                bottom: {
                                  style: 'thin'
                                },
                                left: {
                                  style: 'thin'
                                },
                                right: {
                                  style: 'thin'
                                }
                            }
                          }
                        } else if(i=='A3'){
                          ws[i].s = {
                            // 居中
                            alignment: {
                              horizontal: 'center',
                              wrapText: true
                            },
                            font: {
                              name: '仿宋',
                              sz: 14,
                              bold: true
                            }
                          }
                        }
                      }
                      // 设置单元格宽度
                      ws['!cols'] = [{
                        wpx: 40
                      }, {
                        wpx: 40
                      }, {
                        wpx: 100
                      }, {
                        wpx: 100
                      }]
                      // 导出Excel, 注意这里用到的是XLSXS对象
                      let wbout = XLSXS.write(wb, {
                        bookType: 'xlsx',
                        bookSST: false,
                        type: 'binary'
                      })
                      FileSaver.saveAs(
                        new Blob([this.$options.methods.s2ab(wbout)], {
                          type: 'application/octet-stream'
                        }),
                        filename
                      )

      },
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
        },

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要修改导出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` 模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值