sheetjs导入和导出

一、引入 xlsx 包

import { utils, writeFile, read } from "xlsx";

二、读取一个文件

1、通过传统的方式读取文件

兼容性比较好的方式,创建一个 type 为 file 的元素然后点击它

const inputDom = document.createElement("input");
inputDom.setAttribute("type", "file");
inputDom.onchange = async () => {
  //TODO 操作文件
  const file = await inputDom.files[0].arrayBuffer();
  const worksheet = workbook.Sheets[workbook.SheetNames[0]];
  const raw_data = utils.sheet_to_json(worksheet, { header: 1 });
};
inputDom.click();

2、通过比较新的 api

const fileList = await window.showOpenFilePicker(); //默认会返回一个list
const file = await fileList[0].getFile(); //单选文件所以选择第一个
const arrB = await file.ArrayBuffer(); //sheetjs支持arrayBuffer格式的数据
const workbook = read(arrB); //调用sheetjs的read方法,读取数据
const worksheet = workbook.Sheets[workbook.SheetNames[0]]; //获取到第一张表的数据
const data = utils.sheet_to_json(worksheet, { header: 1 }); //通过utils中的sheet_to_json方法转换成json

Window:showOpenFilePicker() 方法 - Web API 接口参考 | MDN

三、导出数据

1、可以通过页面中 table 元素导出

const wb = utils.table_to_book(document.querySelector("#el-table-result"));
writeFile(wb, "文件的名字需要带后缀.xlsx");

这种方式一些缺点:
1、如果是表格中使用了输入框,则导出的表格中没有输入框中的数据
2、如果表格中使用了无关元素,则导出的表格中会夹带元素上的文字

2、通过 json 对象数组导出

通常情况下,表格的数据格式类似这种

[
  {
    name: "张三",
    age: 10,
    sex: "男",
    address: "翻斗花园二号楼1001室",
  },
  {
    name: "李四",
    age: 11,
    sex: "女",
    address: "翻斗花园二号楼1002室",
  },
];

导出时需要转化为这种样式

[
  {
    姓名: "张三",
    年龄: 10,
    性别: "男",
    地址: "翻斗花园二号楼1001室",
  },
  {
    姓名: "李四",
    年龄: 11,
    性别: "女",
    地址: "翻斗花园二号楼1002室",
  },
];

在 sheet 中默认会使用对象的 key 做表格的表头,整理成这种数据可以更直观

const data = [{ xxxx }];
const ws = utils.json_to_sheet(data);
const wb = utils.book_new();
utils.book_append_sheet(wb, ws, "第三个参数是工作簿的名称,可选");
writeFile(wb, "文件的名字需要带后缀.xlsx"); //运行到这一行代码浏览器即可提示下载

3、通过 json 数组导出

这种导出方式要求数据为一个二维数组,像一张表格平铺

const data = [
  ["姓名", "年龄", "性别", "地址"],
  ["张三", 10, "男", "翻斗花园二号楼1001室"],
  ["李四", 11, "女", "翻斗花园二号楼1002室"],
];

然后将数组导出

const ws = utils.aoa_to_sheet(data);
const wb = utils.book_new();
utils.book_append_sheet(wb, ws, "第三个参数是工作簿的名称,可选");
writeFile(wb, "文件的名字需要带后缀.xlsx");

四、其他

导出教程:https://docs.sheetjs.com/docs/getting-started/examples/export

导入教程:https://docs.sheetjs.com/docs/getting-started/examples/import

api 参考:https://docs.sheetjs.com/docs/api/