美文网首页
前端页面导出表格工具:xlsx-js-style

前端页面导出表格工具:xlsx-js-style

作者: 路人丁0417 | 来源:发表于2024-01-11 15:01 被阅读0次

参考:https://github.com/gitbrent/xlsx-js-style/
参考:https://docs.sheetjs.com/

xlsx-js-style简述

简单来说,xlsx-js-style就是 sheetJs + 基本表格样式。sheetJs 分两个版本,一个是Community Edition版,另一个是Pro版,Pro版需要付费使用,xlsx-js-style使用的是CE版,版本号为:0.18.

下载
npm i xlsx-js-style -S 

当前版本为(1.2.0)
可能会需要修改源码:\node_modules\xlsx-style\dist\cpexcel.js 807行把 var cpt = require('./cpt' + 'able'); 改成 var cpt = cptable;

引入
// vue项目中main.js引入
import XLSX from 'xlsx-js-style';
Vue.prototype.$xlsx = XLSX
使用
let wb = this.$xlsx.utils.table_to_book(
  document.querySelector("#tableId"),
  { raw: true }
);
// 添加样式(定义在下方)
this.addStyle(wb.Sheets.Sheet1)
// 下载
this.$xlsx.writeFile(wb, "sheet.xlsx");
addStyle(ws) {
  for (const key in ws) {

    // 数据列
    if (!key.includes('!')) {
      ws[key].s = {
        font: { // 字体设置
          sz: 9,
          bold: false,
          color: {
            rgb: '000000'// 十六进制,不带#
          }
        },
        alignment: { // 文字居中
          horizontal: 'center',
          vertical: 'center',
          wrapText: true
        },
        border: { // 设置边框
          top: { style: 'thin' },
          bottom: { style: 'thin' },
          left: { style: 'thin' },
          right: { style: 'thin' }
        }
      }
      
      if (ws[key].t === 'z' ) {
        ws[key].t = 's'
      }
    }
  }

  // 给跨行跨列的表格添加边框
  const ranges = ws['!merges']
  if (ranges) {
    ranges.forEach(range => {
      // 拿到合并单元格区域的第一个单元格
      const firstCell = ws[XLSX.utils.encode_cell({r: range.s.r, c:range.s.c})]

      // 遍历当前合并区域的所有但愿格
      for(var R = 0; R <= range.e.r; ++R) {
        for(var C = 0; C <= range.e.c; ++C) {
          ws[XLSX.utils.encode_cell({r:R, c:C})] = firstCell;
        }
      }
    })
  }
}
sheetJs简介
工具函数

sheetJs提供的工具函数大致可以分为两类:

  1. 数据包装:把js数据转化成工作表或工作簿(worksheet或者workbook)
  2. 数据提取:将表格文件中的数据提取出来,生成html(或者csv,text)

aoa_to_sheet 把JS二维数组转换为工作表。
sheet_add_aoa 把JS二维数组中的数据添加到已存在的工作表中。

json_to_sheet 把JS对象数组转换为工作表。
sheet_add_json 把JS对象数组添加到已存在的工作表中。

table_to_sheet 把DOM TABLE元素转换为工作表。
table_to_book 把DOM TABLE元素转换为工作簿。

sheet_add_dom 从DOM TABLE元素中添加数据到已经存在的工作表。

sheet_to_html 通过html元素展示表格。

sheet_to_json 把工作表转换为 JS对象数组。

sheet_to_csv 通过工作表生成csv文件
sheet_to_txt 通过工作表生成text文件
sheet_to_formulae 从表格中提取所有公式

book_append_sheet 添加一个工作表到工作簿中

table_to_sheet示例
// 生成新的工作簿
var workbook = XLSX.utils.book_new();
 
// 把Id为 'table1'的表格添加到工作簿中,工作表名为Sheet1
var ws1 = XLSX.utils.table_to_sheet(document.getElementById('table1'));
XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
 
// 把Id为 'table1'的表格添加到工作簿中,工作表名为Sheet2
var ws2 = XLSX.utils.table_to_sheet(document.getElementById('table2'));
XLSX.utils.book_append_sheet(workbook, ws2, "Sheet2");
 
// 下载表格
XLSX.writeFile(workbook , "sheet.xlsx");
json_to_sheet示例
      const headerArr = ['customer', 'price', 'num', 'totalPrice', 'remark' ]
      const newHeaderArr = ['客户', '价格', '数量', '总价', '备注' ]
      // 过滤不需要的key
      const data = this.contractCompareDetailList.map( 
        obj => Object.fromEntries(
            Object.entries(obj).filter(
              (r) => headerArr.includes(r[0])
            )
          )
      );
      // 把对象数组转换成工作表,表头顺序按照headerArr的顺序
      const ws =XLSX.utils.json_to_sheet(data, { header: headerArr})
      // 创建新的工作簿,0.20.1版本的sheetJs可以支持传参,但当前使用的是0.18.5版本,不支持传参
      const wb = new XLSX.utils.book_new()
      // 把第一行的表头(newHeaderArr )替换成实际需要展示的表头
      XLSX.utils.sheet_add_aoa(ws, [newHeaderArr], { origin: "A1" });
      // 将生成的工作表添加到新的工作簿里,Sheet1是工作表的名称
      XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
      // 下载工作簿
      XLSX.writeFile(wb, "测试.xlsx");
表格样式

style object 包含这些属性:alignment, border, fill, font, numFmt


style_object_property1.png style_object_property2.png color_style.png border_style.png
工作表的稀疏模型(sparse-mode)与紧密模型(dense-mode)

关于稀疏模型,工作表是通过对象的形式保存,对象的key就是每个单元格的位置,形如A1,C4这种形式,所对应的值,就是对应位置的单元格对象。例如:sheet['A4'] = cellObject

紧密模型则是以二维数组的形式保存每个单元格对象,形如:sheet["!data"][R][C] ,其中R和C分别代表从0开始的行索引和列索引。例如:sheet['!data'][0][3] = cellObject

在以前的环境中处理小型工作表时,稀疏工作表比密集工作表更有效。在较新的浏览器中,当处理非常大的工作表时,密集的工作表使用更少的内存,往往更高效。

相关文章

网友评论

      本文标题:前端页面导出表格工具:xlsx-js-style

      本文链接:https://www.haomeiwen.com/subject/ezqzndtx.html