前端导出表格,且带边框样式

本文介绍了在前端项目中,使用iview-admin2.0框架并结合FileSaver、XLSX和xlsx-style库来实现带边框的表格导出。在导入xlsx-style库时遇到模块找不到的问题,通过修改源码解决,并引入了第三方工具xlsxStyle.utils。文章提供了详细的步骤和代码截图,特别强调了为保持表格边框样式的重要性。

背景:
我的项目用的是iview-admin2.0框架,里面将iview进行了升级,而且表格里用到了fiexd,对特殊的列进行了浮动。

需求是要求前端进行表格导出,而且要带边框。

用到了如下技术;
import FileSaver from “file-saver”;

import XLSX from “xlsx”;

import xlsxStyle from “xlsx-style”;

import XSU from “./xlsxStyle.utils”;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

步骤如下:

1.直接npm 分别安装 FileSaver、XLSX、xlsxStyle

FileSaver、XLSX、xlsxStyle可以直接npm;

XSU是git上下载下来的静态资源(https://github.com/Ctrl-Ling/XLSX-Style-Utils),别人封装的方法。
此处不详细贴代码了;

import XLSX from “xlsx-style”

2.我新增加了一个tool.js
在这个js里
import FileSaver from “file-saver”;
import XLSX from “xlsx”;
import xlsxStyle from “xlsx-style”;
import XSU from “./xlsxStyle.utils”;

引入第三个xlsx-style的时候会报错:
This relative module was not found: ./cptable in ./node_modules/xlsx-style@0.8.13@xlsx-style/dist/cpexcel.js
需要修改源码:
在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt = require(’./cpt’ + ‘able’); 改成 var cpt = cptable;(不要因为乱码就不往下了,往下翻)

第四个就是从上面说到的静态资源的链接里down的资源,将里面的xlsxStyle.utils.js放到本地的文件夹里,tool.js 这里要能引到。
我这边放在了同级别目录下;
在这里插入图片描述
当然,xlsxStyle.utils.js 文件最下面
别忘了添加 export default XSU;
在这里插入图片描述

3.tool.js里添加方法,可以多处导出使用
方法如下:

export const exportExcel = (function (id,name) {
  return new Promise((resolve, reject) => {
    /* 从表生成工作簿对象 */
    //  判断要导出的节点中是否有fixed的表格,如果有,转换excel时先将该dom移除,然后append回去,
    let fix = document.querySelector('.ivu-table-fixed-right');
    let wb 
    if (fix) {
      document.querySelector('#' + id).children[0].removeChild(fix);
      wb = XLSX.utils.table_to_book(document.querySelector('#' + id));
      document.querySelector('#' + id).children[0].appendChild(fix);
    } else {
      wb = XLSX.utils.table_to_book(document.querySelector('#' + id));
    }
    var sheetName = wb.SheetNames[0];
    for (let key in wb.Sheets.Sheet1) {
      if (Object.prototype.toString.call(wb.Sheets.Sheet1[key]) === '[object Object]'){
          wb.Sheets.Sheet1[key].v = wb.Sheets.Sheet1[key].v.toString().replace(/\s+/g, "");
          //我的表格里针对fixed属性的一列,不需要导出,没有想到别的好的办法,就直接置空了。我用这个方法导出时,在表达的最下面一行会有'暂无筛选结果',没有找到原因,所以也直接置空。
          if (wb.Sheets.Sheet1[key].v == '暂无筛选结果' || wb.Sheets.Sheet1[key].v == '修改' || wb.Sheets.Sheet1[key].v == '管理' || wb.Sheets.Sheet1[key].v== '操作') {
            wb.Sheets.Sheet1[key].v = ''
          }else {
          //置空的表格的单元格不需要增加边框,故else的时候给单元格增加边框
            XSU.setBorderDefault(wb, sheetName, key)
          }
      }
    }
    var wbout = xlsxStyle.write(wb, {
      bookType: "xlsx",
      bookSST: false, 
      type: 'binary'
    });
    try {
      FileSaver.saveAs(
        //Blob 对象表示一个不可变、原始数据的类文件对象。
        //Blob 表示的不一定是JavaScript原生格式的数据。
        //File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
        //返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
        new Blob([s2ab(wbout)], {
          type: ""
        }),
        //设置导出文件名称
        name + ".xlsx"
      );
    } catch (e) {
      if (typeof console !== "undefined") console.log(e, wbout);
    }
    resolve(wbout)
  })
})

在导出方法里还用到了 s2ab的方法,直接在该方法的上面添加即可;

function 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;
}

截图如下:
在这里插入图片描述
最后步骤:
在你要用到的组件里
// 引入导出Excel表格

import { exportExcel } from "@/libs/tools";

methods里写到:

exportExcel() {
      exportExcel("out-table", "项目推进情况");
    },

PS:
主要是要表格边框,如果不要边框的话就比较简单,几行代码就搞定了。
如有更简单或者其他好的方法,希望可以留言。

灵感来自以下:
https://www.cnblogs.com/lvsk/p/11970747.html
https://github.com/Ctrl-Ling/XLSX-Style-Utils
https://github.com/SheetJS/sheetjs

### 如何在前端导出 XLSX 表格时自定义样式前端导出 XLSX 表格时,可以使用库如 `SheetJS (xlsx)` 来生成 Excel 文件,并通过特定的选项和属性来设置单元格样式。以下是一个详细的解决方案: #### 使用 SheetJS 导出自定义样式XLSX 文件 1. **安装依赖** 首先需要引入 `xlsx` 库。可以通过 npm 安装或直接在 HTML 文件中引入 CDN 链接[^1]。 ```bash npm install xlsx ``` 2. **创建数据和样式** 在生成表格时,可以通过 `cell.styles` 属性为每个单元格指定样式。以下是常见的样式属性: - `font`: 设置字体大小、颜色等。 - `alignment`: 设置对齐方式。 - `fill`: 设置背景颜色。 - `border`: 设置边框样式。 3. **代码示例** 下面是一个完整的代码示例,展示如何导出样式XLSX 文件。 ```javascript const { utils, writeFile } = require('xlsx'); // 创建工作表数据 const data = [ ["姓名", "年龄", "城市"], ["张三", 25, "北京"], ["李四", 30, "上海"] ]; // 转换为工作表对象 const worksheet = utils.aoa_to_sheet(data); // 自定义样式 worksheet['!cols'] = [ { wch: 20 }, // 第一列宽度 { wch: 10 }, // 第二列宽度 { wch: 15 } // 第三列宽度 ]; worksheet.A1.s = { font: { bold: true, color: { rgb: "FF0000" } }, alignment: { horizontal: "center" }, fill: { fgColor: { rgb: "FFFF00" } } }; worksheet.B1.s = { font: { bold: true, color: { rgb: "0000FF" } }, alignment: { horizontal: "center" }, fill: { fgColor: { rgb: "C6EFCE" } } }; worksheet.C1.s = { font: { bold: true, color: { rgb: "FFFFFF" } }, alignment: { horizontal: "center" }, fill: { fgColor: { rgb: "00008B" } } }; // 创建工作簿并添加工作表 const workbook = utils.book_new(); utils.book_append_sheet(workbook, worksheet, "示例"); // 导出文件 writeFile(workbook, "示例.xlsx"); ``` 上述代码中,`worksheet.A1.s` 表示为 A1 单元格设置样式,其中 `font`、`alignment` 和 `fill` 分别定义了字体、对齐方式和填充颜色[^2]。 4. **注意事项** - `SheetJS` 的样式支持有限,某些高级功能可能需要结合后端工具(如 PHP 的 `PhpSpreadsheet`)实现。 - 如果需要更复杂的样式,可以考虑将样式信息嵌入到 HTML 模板中并通过其他插件转换为 Excel 文件。 #### 其他可选方案 除了 `SheetJS`,还可以使用 `exceljs` 库,它提供了更丰富的样式支持,包括图表、图片等功能[^3]。 ```javascript const ExcelJS = require('exceljs'); // 创建工作簿 const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('示例'); // 添加数据 worksheet.addRow(["姓名", "年龄", "城市"]); worksheet.addRow(["张三", 25, "北京"]); worksheet.addRow(["李四", 30, "上海"]); // 设置样式 worksheet.getRow(1).eachCell((cell) => { cell.font = { bold: true, color: { argb: 'FFFFFFFF' } }; cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF0000FF' } }; cell.alignment = { horizontal: 'center' }; }); // 导出文件 workbook.xlsx.writeBuffer().then((data) => { require('fs').writeFileSync('示例.xlsx', data); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值