前端根据后端返回数据导出指定样式的表格(xlsx-js-style)

前言:使用xlsx-style一直报错,有关xlsx-js-style的文章也比较少,设置样式的时候踩过不少坑,因此整合了一下使用xlsx-js-style修改表格样式的方法,包括修改表头、列表、行高、列宽、字体、边框等等,应该是比较全面的

 最后的样式如下图所示:

 

1.下载xlsx-js-style依赖

npm install xlsx-js-style

 2.在main.js中挂载到vue原型上,方便使用

import XLSX from 'xlsx-js-style'
Vue.prototype.$xlsx = XLSX

3.代码及相关解释(有需要补充可以留言)

//html中写一个按钮绑定事件
<el-button @click=export()>导出数据</el-button>
//export()写到method里面
export(){
let Data = [
        ["会议统计数据列表",],
        ["时间", "转写时长", "文档数量", "会议次数", "参会人数"],
      ]; // excel表数据 分别是第一行和第二行数据
      var newData = [];//定义一个数组方便拼接后面的数据
    //请求回来的数据this.DetailsForm格式不是数组,所以使用了map,再把数据push到我创建的数组中
      this.DetailsForm.map((item, index) => {
        newData.push(
          [
            item.DateStr,
            item.SumTransSecond,
            item.SumDoc,
            item.SumMeeting,
            item.SumPerson,
          ]
        );
     });
      let excelData = Data.concat(newData);//数组的拼接
       //this.$xlsx是挂载前面挂载到原型上的,直接使用
      let workbook = this.$xlsx.utils.book_new(); // 工作簿
      let worksheet = this.$xlsx.utils.aoa_to_sheet(excelData); // 数据表
      //以下是样式设置,样式设置放在组织完数据之后,xlsx-js-style的核心API就是SheetJS的
        //样式的设置可以参考相关文档 贴在文章末尾第二个链接
        //修改列宽cols 行宽就用rows 总共5列
         worksheet["!cols"] = [
        {
          width: 36,
        },
        {
          width: 36,
        },
        {
          width: 36,
        },
         {
          width: 36,
        },
        {
          width: 36,
        },
      ];
    // 修改行高 这里我只修改了第一行
      worksheet["!rows"] = [
        {
          hpx: 50,
        },
      ];
    //合并第一行单元格 s和e指范围即第一行 第一列到第五列
     worksheet["!merges"] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 4 } }];
    Object.keys(worksheet).forEach((key) => {
        // 非!开头的属性都是单元格
        // excelData.length是我表格的长度也就是总行数
        //设置从第三行开始的数据样式
        for (let i = 3; i <= excelData.length; i++) {
        //用正则表达式判断是否是某一行
        if (key.replace(/[^0-9]/gi, "") == i) {
            worksheet[key].s = {
            //设置字体
              font: {
                name: "Arial",
                sz: 14,
                bold: false,
                color:{ rgb: "000000" },
              },
            //设置居中
            alignment: {
                horizontal: "center",
                vertical: "center",
                wrapText: true,
              },    
            //设置边框
            border: {
              top: { style: "thin" },
              right: { style: "thin" },
              bottom: { style: "thin" },
              left: { style: "thin" },
            },
              };
            } 
             }
            //设置第一行样式 第一行合并了五个单元格 因此只用设置A1
          if (key == "A1") {
          worksheet[key].s = {
            font: {
              name: "微软雅黑",
              sz: 22,
              bold: false,
              color: "000000",
            },
            alignment: {
              horizontal: "center",
              vertical: "center",
              wrapText: true,
            },
             border: {
              top: { style: "thin" },
              right: { style: "thin" },
              bottom: { style: "thin" },
              left: { style: "thin" },
            },
            };
            }else if ( key == "A2" ||key == "B2" ||key == "C2" ||key == "D2" ||key ==                     
           "E2") //设置第二行的样式
            {
              worksheet[key].s = {
                fill: { fgColor: { rgb: "000000" } },
                font: {
                  sz: 20,
                  name: "微软雅黑",
                  bold: true,
                  color: { rgb: "FFFFFF" },//最好写成这样,color: "000000"设置背景色会不生效
                },
               alignment: {
                  horizontal: "center",
                  vertical: "center",
                  wrapText: true,
                },
                border: {
                  top: { style: "thin" },
                  right: { style: "thin" },
                  bottom: { style: "thin" },
                  left: { style: "thin" },
                },
             };
            }
          });
          this.$xlsx.utils.book_append_sheet(workbook, worksheet, "Sheet1");
          this.$xlsx.writeFile(workbook, "会议统计表格.xlsx");//表格名称
}
        

4.参考文档

1.只设置了第一行和第二行的表头样式,没有写怎么拼接请求回来数据和后面的样式设置

https://blog.csdn.net/mingketao/article/details/125333066

2.很详细的样式设置说明,涉及到一些参数的使用,中文文档比较友好

https://zhuanlan.zhihu.com/p/257845606

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要修改导出的 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` 模块。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值