SheetJS 社區(qū)版提供了久經(jīng)考驗(yàn)的開源解決方案,用于從幾乎任何復(fù)雜的電子表格中提取有用的數(shù)據(jù),并生成適用于傳統(tǒng)和現(xiàn)代軟件的新電子表格。
SheetJS Pro 提供超越數(shù)據(jù)處理的解決方案:輕松編輯復(fù)雜模板;用造型釋放你內(nèi)心的畢加索;使用圖像/圖表/數(shù)據(jù)透視表制作自定義工作表;評(píng)估公式表達(dá)式和端口計(jì)算到 Web 應(yīng)用程序;自動(dòng)化常見的電子表格任務(wù)等。
兼容性
SheetJS入門
安裝
完整的瀏覽器獨(dú)立構(gòu)建保存 dist/xlsx.full.min.js 并可以直接添加到帶有<script>
標(biāo)簽的頁面:
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
每個(gè)獨(dú)立的發(fā)布腳本都可以在 https://cdn.sheetjs.com/獲得。最新版本使用 l
atest
標(biāo)簽:
<!-- use the latest version -->
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script>
可以通過版本引用特定的發(fā)行版:
<!-- use version 0.18.5 -->
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-0.18.5/package/dist/xlsx.full.min.js"></script>
對(duì)于生產(chǎn)用途,應(yīng)下載腳本并將其與其他腳本一起添加到公用文件夾中。
瀏覽器構(gòu)建
完整的單文件版本生成于dist/xlsx.full.min.js
dist/xlsx.core.min.js省略代碼頁庫(不支持 XLS 編碼)
在dist/xlsx.mini.min.js. 與完整版本相比:
這些腳本也可在 CDN 上找到:
<!-- use xlsx.mini.min.js from the latest version -->
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.mini.min.js"></script>
ECMAscript 模塊
ECMAscript 模塊構(gòu)建被保存到xlsx.mjs并可以直接添加到帶有script標(biāo)簽的頁面,使用type="module":
<script type="module">
import { read, writeFileXLSX } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
/* load the codepage support library for extended support with older formats */
import { set_cptable } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
import * as cptable from 'https://cdn.sheetjs.com/xlsx-latest/package/dist/cpexcel.full.mjs';
set_cptable(cptable);
</script>
NodeJS 包還公開了帶有module參數(shù)的模塊,Angular 和其他項(xiàng)目都支持該參數(shù):
import { read, writeFileXLSX } from "xlsx";
/* load the codepage support library for extended support with older formats */
import { set_cptable } from "xlsx";
import * as cptable from 'xlsx/dist/cpexcel.full.mjs';
set_cptable(cptable);
SheetJS用法
大多數(shù)涉及電子表格和數(shù)據(jù)的場景可以分為 5 個(gè)部分:
• 獲取數(shù)據(jù):數(shù)據(jù)可以存儲(chǔ)在任何地方:本地或遠(yuǎn)程文件、數(shù)據(jù)庫、HTML TABLE,甚至在 Web 瀏覽器中以編程方式生成。
• 提取數(shù)據(jù):對(duì)于電子表格文件,這涉及解析原始字節(jié)以讀取單元格數(shù)據(jù)。對(duì)于一般的 JS 數(shù)據(jù),這涉及到重塑數(shù)據(jù)。
• 處理數(shù)據(jù):從生成匯總統(tǒng)計(jì)數(shù)據(jù)到清理數(shù)據(jù)記錄,這一步是問題的核心。
• 數(shù)據(jù)包:這可能涉及制作新的電子表格或使用 XML 序列化JSON.stringify或編寫 XML 或簡單地為 UI 工具展平數(shù)據(jù)。
• 發(fā)布數(shù)據(jù):電子表格文件可以上傳到服務(wù)器或本地寫入。數(shù)據(jù)可以在 HTML TABLE 或數(shù)據(jù)網(wǎng)格中呈現(xiàn)給用戶。
一個(gè)常見問題涉及從存儲(chǔ)在 HTML 表中的數(shù)據(jù)生成有效的電子表格導(dǎo)出。在此示例中,將抓取頁面上的 HTML TABLE,將在底部添加一行帶有報(bào)告日期的行,并在本地生成和下載新文件。XLSX.writeFile 負(fù)責(zé)打包數(shù)據(jù)并嘗試本地下載:
// Acquire Data (reference to the HTML table)
var table_elt = document.getElementById("my-table-id");
// Extract Data (create a workbook object from the table)
var workbook = XLSX.utils.table_to_book(table_elt);
// Process Data (add a new row)
var ws = workbook.Sheets["Sheet1"];
XLSX.utils.sheet_add_aoa(ws, [["created "+new Date().toISOString()]], {origin:-1});
// Package and Release Data (`writeFile` tries to write and save an XLSB file)
XLSX.writeFile(workbook, "Report.xlsb");
read 該庫嘗試使用從電子表格文件 ( / ) 中提取有用數(shù)據(jù)并從數(shù)據(jù) ( / )readFile生成新電子表格文件的功能來簡化步驟 2 和 4 。其他實(shí)用功能,例如 與其他常見數(shù)據(jù)源(如 HTML 表)一起使用。
writewriteFiletable_to_book 本文檔和各種演示項(xiàng)目涵蓋了步驟 1 和 5 的許多常見場景和方法。
獲取和提取數(shù)據(jù)
解析工作簿
從電子表格字節(jié)中提取數(shù)據(jù)
var workbook = XLSX.read(data, opts);
該方法可以從存儲(chǔ)在 JS 字符串、“二進(jìn)制字符串”、NodeJS 緩沖區(qū)或類型化數(shù)組(或)read中的電子表格字節(jié)中提取數(shù)據(jù)。Uint8ArrayArrayBuffer
從本地文件讀取電子表格字節(jié)并提取數(shù)據(jù)
var workbook = XLSX.readFile(filename, opts);
該readFile方法嘗試在提供的路徑中讀取電子表格文件。瀏覽器一般不允許以這種方式讀取文件(這被認(rèn)為存在安全風(fēng)險(xiǎn)),嘗試以這種方式讀取文件會(huì)拋出錯(cuò)誤。
例子
NodeJS 服務(wù)器中的本地文件
readFilefs.readFileSync 在引擎蓋下使用:
var XLSX = require("xlsx");
var workbook = XLSX.readFile("test.xlsx");
對(duì)于節(jié)點(diǎn) ESM,readFile 未啟用幫助程序。相反,fs.readFileSync 應(yīng)該用于讀取文件數(shù)據(jù),以 Buffer 供使用 XLSX.read:
import { readFileSync } from "fs";
import { read } from "xlsx/xlsx.mjs";
const buf = readFileSync("test.xlsx");
/* buf is a Buffer */
const workbook = read(buf);
網(wǎng)頁中用戶提交的文件
// XLSX is a global from the standalone script
async function handledropAsync(e) {
e.stopPropagation(); e.preventDefault();
const f = e.dataTransfer.files[0];
/* f is a File */
const data = await f.arrayBuffer();
/* data is an ArrayBuffer */
const workbook = XLSX.read(data);
/* DO SOMETHING WITH workbook HERE */
}
drop_dom_element.addEventListener("drop", handledropAsync, false);
為了獲得最大的兼容性,F(xiàn)ileReader應(yīng)使用 API:
function handledrop(e) {
e.stopPropagation(); e.preventDefault();
var f = e.dataTransfer.files[0];
/* f is a File */
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
/* reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */
var workbook = XLSX.read(data);
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsArrayBuffer(f);
}
drop_dom_element.addEventListener("drop", handledrop, false);
簡單下載示例
/**
* JSON轉(zhuǎn)換Excel
*/
function jsonToSheet () {
let json = [
{
"姓名": "EJ",
"性別": "男",
},
{
"姓名": "LSQ",
"性別": "女",
}
]
// 實(shí)例化一個(gè)工作簿
let book = XLSX.utils.book_new()
// 實(shí)例化一個(gè)Sheet
let sheet = XLSX.utils.json_to_sheet(json, {
header: ['姓名', '性別']
})
// 將Sheet寫入工作簿
XLSX.utils.book_append_sheet(book, sheet, 'Sheet1')
// 寫入文件,直接觸發(fā)瀏覽器的下載
XLSX.writeFile(book, 'jsonToSheet.xlsx')
}
/**
* 數(shù)組轉(zhuǎn)換Excel
*/
function arrayToSheet () {
let data = [
['姓名', '性別'],
['EJ', '男'],
['LSQ', '女']
]
// 實(shí)例化一個(gè)工作簿
let book = XLSX.utils.book_new()
// 實(shí)例化一個(gè)Sheet
let sheet = XLSX.utils.aoa_to_sheet(data)
// 將Sheet寫入工作簿
XLSX.utils.book_append_sheet(book, sheet, 'Sheet1')
// 寫入文件,直接觸發(fā)瀏覽器的下載
XLSX.writeFile(book, 'arrayToSheet.xlsx')
}
傳送門
開源協(xié)議:Apache-2.0 License
開源地址:https://github.com/SheetJS/sheetjs
-END-