New Git https://git.sheetjs.com/SheetJS/sheetjs
Old Git https://github.com/SheetJS/sheetjs
在线导出案例 https://sheetjs.com/demo/table.html
在线文档
https://docs.sheetjs.com/docs
Github https://github.com/SheetJS/docs.sheetjs.com
相关 excel
https://github.com/protobi/js-xlsx/
canvas-datagrid
xlsx cdn
一般情况下用 xlsx.core.min.js 就够了,xlsx.full.min.js 则是包含了所有功能模块
// pnpm add xlsxhttps://unpkg.com/browse/xlsx@0.18.5/https://unpkg.com/browse/xlsx@0.18.5/dist/xlsx.core.min.js
read
read(data, {type: ‘binary’}) 解析data数据 解析的类型, type 类型
- base64: 以base64方式读取;
- binary: BinaryString格式(byte n is data.charCodeAt(n))
- string: UTF8编码的字符串;
- buffer: nodejs Buffer;
- array: Uint8Array,8位无符号数组;
- file: 文件的路径(仅nodejs下支持
js 读取 xlsx 参考
http://blog.haoji.me/js-excel.html#dao-chu-excel
// 读取本地 excel文件function readWorkbookFromLocalFile(file, callback) {const reader = new FileReader();reader.onload = function(e) {const data = e.target.result;const workbook = XLSX.read(data, {type: 'binary'});if(callback) callback(workbook);};reader.readAsBinaryString(file);}
workbook
// 将workbook装化成blob对象function workbook2blob(workbook) {// 生成excel的配置项var wopts = {// 要生成的文件类型bookType: "xlsx",// // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性bookSST: false,type: "binary"};var wbout = XLSX.write(workbook, wopts);// 将字符串转ArrayBufferfunction 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;}var blob = new Blob([s2ab(wbout)], {type: "application/octet-stream"});return blob;}// 将blob对象创建bloburl,然后用a标签实现弹出下载框function openDownloadDialog(blob, fileName) {if (typeof blob == "object" && blob instanceof Blob) {blob = URL.createObjectURL(blob); // 创建blob地址}var aLink = document.createElement("a");aLink.href = blob;// HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效aLink.download = fileName || "";var event;if (window.MouseEvent) event = new MouseEvent("click");// 移动端else {event = document.createEvent("MouseEvents");event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);}aLink.dispatchEvent(event);}let sheet1data = [{ department: "行政部", count: 2 }, { department: "前端部", count: 2 }];let sheet2data = [{ name: "张三", do: "整理文件" }, { name: "李四", do: "打印" }];let sheet3data = [{ name: "张大人", do: "vue" }, { name: "李大人", do: "react" }];var sheet1 = XLSX.utils.json_to_sheet(sheet1data);var sheet2 = XLSX.utils.json_to_sheet(sheet2data);var sheet3 = XLSX.utils.json_to_sheet(sheet3data);/* create a new blank workbook */var wb = XLSX.utils.book_new();XLSX.utils.book_append_sheet(wb, sheet1, "部门统计");XLSX.utils.book_append_sheet(wb, sheet2, "行政部");XLSX.utils.book_append_sheet(wb, sheet3, "前端部");const workbookBlob = workbook2blob(wb);openDownloadDialog(workbookBlob, `部门统计.xlsx`);
Sheets
const { Sheets, SheetNames } = workbook// 第一个 sheetSheets[SheetNames[0]]
