SheetJS中文文档-js导出Excel脚本库[通俗易懂]
轉載自 GITHUB用戶rockboom 的翻譯文檔
SheetJs下載: GITHUB地址 | CSDN下載地址
基礎案例
<html lang="zh-cn"><head>
<meta charset="UTF-8">
<title>JS讀取和導出excel示例</title>
<meta name="description" content="使用sheetjs讀取和導出excel示例">
<style type="text/css"> table {
border-collapse: collapse; } th, td {
border: solid 1px #6D6D6D; padding: 5px 10px; } .mt-sm {
margin-top: 8px;} body {
background: #f4f4f4; padding: 0; margin: 0; } .container {
width: 1024px; margin: 0 auto; background: #fff; padding: 20px; min-height: 100vh; } </style>
</head>
<body>
<div class="container">
<h1>JavaScript讀取和導出excel示例(基于js-xlsx)</h1>
<div>
<a _target="_blank">如何使用JavaScript實現純前端讀取和導出excel文件</a><br>
<a >官網演示</a><br>
<a >Github</a>
</div>
<h2>讀取excel(僅讀取第一個sheet)</h2>
<div class="mt-sm">
<input type="file" id="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel">
<a href="javascript:selectFile()">加載本地excel文件</a>
<a href="javascript:loadRemoteFile('./sample/sample.xlsx')">加載遠程excel文件</a>
</div>
<p>結果輸出:(下面表格可直接編輯導出)</p>
<div id="result" contenteditable=""><table><tbody><tr><th></th><th>A</th><th>B</th><th>C</th><th>D</th></tr><tr><td>1</td><td>姓名</td><td>性別</td><td>年齡</td><td>籍貫</td></tr><tr><td>2</td><td>張三</td><td>男</td><td>18</td><td>廣東惠州</td></tr><tr><td>3</td><td>李四</td><td>女</td><td>22</td><td>河北石家莊</td></tr></tbody></table></div>
<h2>導出excel</h2>
<div class="mt-sm">
<input type="button" onclick="exportExcel()" value="保存"> 上面讀取的表格您可以直接編輯,編輯后點擊保存即可導出excel文件。
</div>
<h2>導出帶單元格合并的excel</h2>
<input type="button" value="導出" onclick="exportSpecialExcel()">
</div>
<script type="text/javascript" src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript" src="https://static.newmorehot.com/Public/Home/assets/js/jsxlsx/xlsx.core.min.js"></script>
<script type="text/javascript"> function selectFile() {
document.getElementById('file').click(); } // 讀取本地excel文件 function readWorkbookFromLocalFile(file, callback) {
var reader = new FileReader(); reader.onload = function(e) {
var data = e.target.result; var workbook = XLSX.read(data, {
type: 'binary'}); if(callback) callback(workbook); }; reader.readAsBinaryString(file); } // 從網絡上讀取某個excel文件,url必須同域,否則報錯 function readWorkbookFromRemoteFile(url, callback) {
var xhr = new XMLHttpRequest(); xhr.open('get', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) {
if(xhr.status == 200) {
var data = new Uint8Array(xhr.response) var workbook = XLSX.read(data, {
type: 'array'}); if(callback) callback(workbook); } }; xhr.send(); } // 讀取 excel文件 function outputWorkbook(workbook) {
var sheetNames = workbook.SheetNames; // 工作表名稱集合 sheetNames.forEach(name => {
var worksheet = workbook.Sheets[name]; // 只能通過工作表名稱來獲取指定工作表 for(var key in worksheet) {
// v是讀取單元格的原始值 console.log(key, key[0] === '!' ? worksheet[key] : worksheet[key].v); } }); } function readWorkbook(workbook) {
var sheetNames = workbook.SheetNames; // 工作表名稱集合 var worksheet = workbook.Sheets[sheetNames[0]]; // 這里我們只讀取第一張sheet var csv = XLSX.utils.sheet_to_csv(worksheet); document.getElementById('result').innerHTML = csv2table(csv); } // 將csv轉換成表格 function csv2table(csv) {
var html = '<table>'; var rows = csv.split('\n'); rows.pop(); // 最后一行沒用的 rows.forEach(function(row, idx) {
var columns = row.split(','); columns.unshift(idx+1); // 添加行索引 if(idx == 0) {
// 添加列索引 html += '<tr>'; for(var i=0; i<columns.length; i++) {
html += '<th>' + (i==0?'':String.fromCharCode(65+i-1)) + '</th>'; } html += '</tr>'; } html += '<tr>'; columns.forEach(function(column) {
html += '<td>'+column+'</td>'; }); html += '</tr>'; }); html += '</table>'; return html; } function table2csv(table) {
var csv = []; $(table).find('tr').each(function() {
var temp = []; $(this).find('td').each(function() {
temp.push($(this).html()); }) temp.shift(); // 移除第一個 csv.push(temp.join(',')); }); csv.shift(); return csv.join('\n'); } // csv轉sheet對象 function csv2sheet(csv) {
var sheet = {
}; // 將要生成的sheet csv = csv.split('\n'); csv.forEach(function(row, i) {
row = row.split(','); if(i == 0) sheet['!ref'] = 'A1:'+String.fromCharCode(65+row.length-1)+(csv.length-1); row.forEach(function(col, j) {
sheet[String.fromCharCode(65+j)+(i+1)] = {
v: col}; }); }); return sheet; } // 將一個sheet轉成最終的excel文件的blob對象,然后利用URL.createObjectURL下載 function sheet2blob(sheet, sheetName) {
sheetName = sheetName || 'sheet1'; var workbook = {
SheetNames: [sheetName], Sheets: {
} }; workbook.Sheets[sheetName] = sheet; // 生成excel的配置項 var wopts = {
bookType: 'xlsx', // 要生成的文件類型 bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開啟生成速度會下降,但在低版本IOS設備上有更好的兼容性 type: 'binary' }; var wbout = XLSX.write(workbook, wopts); var blob = new Blob([s2ab(wbout)], {
type:"application/octet-stream"}); // 字符串轉ArrayBuffer 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; } return blob; } /** * 通用的打開下載對話框方法,沒有測試過具體兼容性 * @param url 下載地址,也可以是一個blob對象,必選 * @param saveName 保存文件名,可選 */ function openDownloadDialog(url, saveName) {
if(typeof url == 'object' && url instanceof Blob) {
url = URL.createObjectURL(url); // 創建blob地址 } var aLink = document.createElement('a'); aLink.href = url; aLink.download = saveName || ''; // HTML5新增的屬性,指定保存文件名,可以不要后綴,注意,file:///模式下不會生效 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); } $(function() {
document.getElementById('file').addEventListener('change', function(e) {
var files = e.target.files; if(files.length == 0) return; var f = files[0]; if(!/\.xlsx?$/g.test(f.name)) {
alert('僅支持讀取xlsx格式!'); return; } readWorkbookFromLocalFile(f, function(workbook) {
readWorkbook(workbook); }); }); loadRemoteFile('./sample/test.xlsx'); }); function loadRemoteFile(url) {
readWorkbookFromRemoteFile(url, function(workbook) {
readWorkbook(workbook); }); } function exportExcel() {
var csv = table2csv($('#result table')[0]); var sheet = csv2sheet(csv); var blob = sheet2blob(sheet); openDownloadDialog(blob, '導出.xlsx'); } function exportSpecialExcel() {
var aoa = [ ['主要信息', null, null, '其它信息'], // 特別注意合并的地方后面預留2個null ['姓名', '性別', '年齡', '注冊時間'], ['張三', '男', 18, new Date()], ['李四', '女', 22, new Date()] ]; var sheet = XLSX.utils.aoa_to_sheet(aoa); sheet['!merges'] = [ // 設置A1-C1的單元格合并 {
s: {
r: 0, c: 0}, e: {
r: 0, c: 2}} ]; openDownloadDialog(sheet2blob(sheet), '單元格合并示例.xlsx'); } </script>
</body></html>
SheetJS js-xlsx
SheetJS是用于多種電子表格格式的解析器和編寫器。通過官方規范、相關文檔以及測試文件實現簡潔的JS方法。SheetJS強調解析和編寫的穩健,其跨格式的特點和統一的JS規范兼容,并且ES3/ES5瀏覽器向后兼容IE6。
目前這個是社區版,我們也提供了性能增強的專業版,專業版提供樣式和專業支持的附加功能。
專業版
商業支持
介紹文檔
瀏覽器示例
源碼
問題和錯誤報告
常見的支持問題
支持的電子數據表的文件格式:
支持格式的圖表 (點擊查看)
瀏覽器測試
目錄表
點擊展示目錄表
- 安裝
- JS 生態示例
- 可選模塊
- ECMAScript 5 兼容性
- 原理
- 解析工作簿
- 解析示例
- 流式讀取
- 操作工作簿
- 解析和編寫示例
- 編寫工作簿
- 編寫示例
- 流式寫入
- 接口
- 解析函數
- 編寫函數
- 工具函數
- 常用電子表格的格式
- 一般結構
- 單元格對象
- 數據類型
- 日期類型
- 數據表對象
- 工作表對象
- 圖表對象
- 宏對象
- 對話表對象
- 工作簿對象
- 工作簿的文件屬性
- 工作簿級別的屬性
- 定義名稱
- 查看工作表
- 其他的工作簿屬性
- 文檔特點
- 公式
- 列屬性
- 行屬性
- 數字格式化
- 超鏈接
- 單元格注釋
- 表的可見性
- VBA和宏命令
- 解析選項
- 輸入類型
- 猜測文件類型
- 編寫選項
- 支持的輸出格式
- 輸出類型
- 工具函數
- 數組輸入
- 對象輸入
- HTML Table 輸入
- 公式輸出
- 分隔符輸出
- UTF-16 Unicode 文本
- HTML 輸出
- JSON
- 文件格式
- Excel 2007+ XML (XLSX/XLSM)
- Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)
- Excel 97-2004 Binary (BIFF8)
- Excel 2003-2004 (SpreadsheetML)
- Excel 2007+ Binary (XLSB, BIFF12)
- Delimiter-Separated Values (CSV/TXT)
- 其它的工作簿格式
- Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)
- Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)
- OpenDocument Spreadsheet (ODS/FODS)
- Uniform Office Spreadsheet (UOS1/2)
- 其它的單表格式
- dBASE and Visual FoxPro (DBF)
- Symbolic Link (SYLK)
- Lotus Formatted Text (PRN)
- Data Interchange Format (DIF)
- HTML
- Rich Text Format (RTF)
- Ethercalc Record Format (ETH)
- 測試
- Node
- 瀏覽器
- 測試環境
- 測試文件
- 合作
- OSX/Linux
- Windows
- 測試
- 證書
- 引用
安裝
在瀏覽器里使用,增加一個script標簽:
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
使用CDN (點擊顯示詳情)
| CDN | URL |
|---|---|
unpkg |
https://unpkg.com/xlsx/ |
jsDelivr |
https://jsdelivr.com/package/npm/xlsx |
CDNjs |
http://cdnjs.com/libraries/xlsx |
packd |
https://bundle.run/xlsx@latest?name=XLSX |
unpkg提供最新的版本:
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
使用 npm:
$ npm install xlsx
使用 bower:
$ bower install js-xlsx
JS生態示例
示例 目錄 包括了一些簡單的項目:
框架和APIS
angularjsangular 2 / 4 / 5 / 6 and ionicknockoutmeteorreact and react-nativevue 2.x and weexXMLHttpRequest and fetchnodejs serverdatabases and key/value storestyped arrays and math
打包工具
browserifyfuseboxparcelrequirejsrollupsystemjstypescriptwebpack 2.x
集成平臺
electron applicationnw.js applicationChrome / Chromium extensionsAdobe ExtendScriptHeadless Browserscanvas-datagridSwift JSC and other engines"serverless" functionsinternet explorer
可選模塊
可選特點 (點擊顯示詳情) node版本自動要求模塊提供其他的特性。某些模塊的文件相當大而且僅在一些特殊的場景下才會用到,因此不應該把他們當做核心部分一起加載。在瀏覽器中用到這些模塊時,可以用下面的方式進行加載:
<!-- international support from js-codepage -->
<script src="dist/cpexcel.js"></script>
每一個依賴合適的版本可以放在 dist/directory 目錄下。
完整的單文件版本在 dist/xlsx.full.min.js 文件里面。
默認情況下,Webpack和Browserify構建包含可選的模塊。可以通過配置Webpack移除對 resolve.alias 的支持:
/* uncomment the lines below to remove support */
resolve: {
alias: {
"./dist/cpexcel.js": "" } // <-- omit international support
}
ECMAScript 5 的兼容性
自從庫使用了像 Array#forEach 這樣的函數,老版本的瀏覽器需要shim 提供缺少的函數。
要在加載 xlsx.js 的script標簽之前添加shim,才能使用它。
<!-- add the shim first -->
<script type="text/javascript" src="shim.min.js"></script>
<!-- after the shim is referenced, add the library -->
<script type="text/javascript" src="xlsx.full.min.js"></script>
shim.min.js也包括了在IE6-9中用于加載和保存文件的 IE_LoadFile 和 IE_SaveFile。對于適用于Photoshop和其它的Adobe產品的格式,xlsx.extendscript.js腳本會綁定shim。
原理
原理 (點擊顯示詳情) 在SheetJS之前,處理電子表格文件的接口只能用于特定的格式。許多第三方庫要么支持一種格式,要么為每一種支持的文件類型提供一個不同的類集。雖然在Excel 2007里面引入了XLSB,但只有Sheet和Excel支持這種格式。
為了提高不可知格式的顯示,js-xlsx使用了被稱作[“Common Spreadsheet Format”]的純JS的顯示方法(#common-spreadsheet-format)。強調一種統一的顯示方式,能夠有一些特點,比如格式轉換和嵌套class tap。通過提取出各種格式的復雜性,工具沒有必要擔心特定的文件類型。
一個簡單的的對象顯示和細心的代碼練習相結合,能讓示例運行在較老的瀏覽器以及像ExtendScript和Web Workers這樣可選擇的環境里執行。雖然很想使用最新的和最好的特性,不過這些特性需要最新的瀏覽器,用以限制兼容性。
工具函數捕獲通用的使用例子,比如生成JS對象或HTML。大多數簡單例子的操作只要幾行代碼。大多數復雜的普遍的復雜操作應該直截了當的生成。
在Excel 2007種,Excel添加XSLX格式作為默認的起始端。然而,有一些其他格式會更多的出現上述的屬性。例如,XLSB格式XLSX格式相似,不過文件會使用一半的空間,而且也會更開的打開文件。雖然XLSX編寫器可以使用,但是其他格式的編寫器也可以使用,因此使用者能夠充分利用每一種格式獨特的特點。社區版本的主要關注點在正確的數據轉換,即從任意一個兼容的數據表示中提取數據,導出適用于任意第三方接口的各種數據格式。
解析工作簿
對于解析,第一步是讀取文件。這一步包括獲取數據并且導入數據庫。這里有一些常用的例子。
nodejs讀取文件 (點擊顯示詳情) `readFile` 只能在服務器環境中使用。瀏覽器沒有用于讀取任意指定路徑文件的API,因此必須使用另外的策略。 “`js if(typeof require !== ‘undefined’) XLSX = require(‘xlsx’); var workbook = XLSX.readFile(‘test.xlsx’); /* DO SOMETHING WITH workbook HERE */ “`
Photoshop ExtendScript讀取文件 (點擊顯示詳情)
readFile 用Photoshop和其他的ExtendScript目標把邏輯File包起來。需要指定文件的絕對路徑
#include "xlsx.extendscript.js"
/* Read test.xlsx from the Documents folder */
var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx');
/* DO SOMETHING WITH workbook HERE */
extendscript 包含了一個更復雜的例子。
瀏覽器從頁面讀取TABLE元素 (點擊顯示詳情) `table_to_book` 和 `table_to_sheet`工具函數獲取DOM的TABLE元素,并且通過子節點進行迭代。
var workbook = XLSX.utils.table_to_book(document.getElementById('tableau'));
/* DO SOMETHING WITH workbook HERE */
一個網頁里面的多張表可以被轉換成單個的工作表。
/* create new workbook */
var workbook = XLSX.utils.book_new();
/* convert table 'table1' to worksheet named "Sheet1" */
var ws1 = XLSX.utils.table_to_sheet(document.getElementById('table1'));
XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
/* convert table 'table2' to worksheet named "Sheet2" */
var ws2 = XLSX.utils.table_to_sheet(document.getElementById('table2'));
XLSX.utils.book_append_sheet(workbook, ws2, "Sheet2");
/* workbook now has 2 worksheets */
另一種選擇,HTML代碼也可以被提取和解析。
var htmlstr = document.getElementById('tableau').outerHTML;
var workbook = XLSX.read(htmlstr, {
type:'string'});
瀏覽器下載文件(ajax) (點擊顯示詳情) 注意:對于運行在老版瀏覽器里更完整的例子,請查看示例
var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
/* set up async GET request */
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.responseType = "arraybuffer";
req.onload = function(e) {
var data = new Uint8Array(req.response);
var workbook = XLSX.read(data, {
type:"array"});
/* DO SOMETHING WITH workbook HERE */
}
req.send();
瀏覽器拖拽 (點擊顯示詳情) 拖拽使用了HTML5 的 `FileReader` API,加載數據時使用`readAsBinaryString` 或 `readAsArrayBuffer`。但并不是所有的瀏覽器都支持全部的 `FileReader` API,因此非常推薦動態的特性檢測。
var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer
function handleDrop(e) {
e.stopPropagation(); e.preventDefault();
var files = e.dataTransfer.files, f = files[0];
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
if(!rABS) data = new Uint8Array(data);
var workbook = XLSX.read(data, {
type: rABS ? 'binary' : 'array'});
/* DO SOMETHING WITH workbook HERE */
};
if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);
}
drop_dom_element.addEventListener('drop', handleDrop, false);
瀏覽器通過form元素上傳文件 (點擊顯示詳情)
來自file input元素的數據能夠被和拖拽例子中相同的FileReaderAPI處理。
var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer
function handleFile(e) {
var files = e.target.files, f = files[0];
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
if(!rABS) data = new Uint8Array(data);
var workbook = XLSX.read(data, {
type: rABS ? 'binary' : 'array'});
/* DO SOMETHING WITH workbook HERE */
};
if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);
}
input_dom_element.addEventListener('change', handleFile, false);
oldie示例展示了一個IE兼容性的回退方案。
包括移動App文件處理等更多的使用例子可以在included demos中查看。
流式讀取文件
為什么沒有流式讀取API? (點擊顯示詳情)
最常用的和最令人感興趣的格式(XLS, XLSX/M, XLSB, ODS)最終都是ZIP或CFB文件容器。兩種格式都不會放目錄結構在文件開頭:ZIP文件把主要的目錄記錄放在邏輯文件的結尾,然而CFB文件可以把存儲信息放在文件的任何地方。所以,為了正確地處理這些格式,流式函數必須在開始之前緩存整個文件。這樣證明了流式的期待的錯誤,因此我們不提供任何流式閱讀API。
當處理可讀流時,最簡單的方式是緩存流,并且最后再去處理整個文件。這可以通過臨時文件或者是顯式連接流來實現。
顯式連接流 (點擊顯示詳情)
var fs = require('fs');
var XLSX = require('xlsx');
function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
var buffers = [];
stream.on('data', function(data) {
buffers.push(data); });
stream.on('end', function() {
var buffer = Buffer.concat(buffers);
var workbook = XLSX.read(buffer, {
type:"buffer"});
/* DO SOMETHING WITH workbook IN THE CALLBACK */
cb(workbook);
});
}
使用像concat-stream這樣的模塊會有更多有效的解決辦法可以使用。
首先寫入文件系統 (點擊顯示詳情)
這個例子使用tempfile生成文件名。
var fs = require('fs'), tempfile = require('tempfile');
var XLSX = require('xlsx');
function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
var fname = tempfile('.sheetjs');
console.log(fname);
var ostream = fs.createWriteStream(fname);
stream.pipe(ostream);
ostream.on('finish', function() {
var workbook = XLSX.readFile(fname);
fs.unlinkSync(fname);
/* DO SOMETHING WITH workbook IN THE CALLBACK */
cb(workbook);
});
}
使用工作簿
完整的對象格式會在本文件的后面部分進行介紹。
讀取指定的單元格 (點擊顯示詳情)
這個例子提取first工作表中A1單元格的存儲值:
var first_sheet_name = workbook.SheetNames[0];
var address_of_cell = 'A1';
/* Get worksheet */
var worksheet = workbook.Sheets[first_sheet_name];
/* Find desired cell */
var desired_cell = worksheet[address_of_cell];
/* Get the value */
var desired_value = (desired_cell ? desired_cell.v : undefined);
在工作簿中增加新的工作表 (點擊顯示詳情)
例子中使用XLSX.utils.aoa_to_sheet生成工作表,使用XLSX.utils.book_append_sheet把表添加到工作簿中。
var new_ws_name = "SheetJS";
/* make worksheet */
var ws_data = [
[ "S", "h", "e", "e", "t", "J", "S" ],
[ 1 , 2 , 3 , 4 , 5 ]
];
var ws = XLSX.utils.aoa_to_sheet(ws_data);
/* Add the worksheet to the workbook */
XLSX.utils.book_append_sheet(wb, ws, ws_name);
從頭開始創建工作簿 (點擊顯示詳情)
工作簿對象包含一個SheetNames名稱數組和一個Sheets對象,用來將表名映射到表對象。XLSX.utils.book_new工具函數創建一個新的工作簿對象:
/* create a new blank workbook */
var wb = XLSX.utils.book_new();
新的工作簿是空白的而且不包含工作表。如果工作簿,那么寫入函數將會出錯。
解析和編寫示例
-
http://sheetjs.com/demos/modify.html read + modify + write files
-
https://github.com/SheetJS/js-xlsx/blob/master/bin/xlsx.njs node
node安裝一個能夠讀取電子數據表和輸出各種格式的命令行工具 xlsx。源碼可以在 bin 目錄下的xlsx.njs里面找到。
XLSX.utils中的一些輔助函數會生成不同的工作表視圖。
XLSX.utils.sheet_to_csv生成CSV文件XLSX.utils.sheet_to_txt生成UTF16的格式化文本XLSX.utils.sheet_to_html生成HTMLXLSX.utils.sheet_to_json生成一個對象數組XLSX.utils.sheet_to_formulae生成一張公示列表
編寫工作簿
對編寫而言,第一步是生成導出數據。輔助函數write 和 writeFile將會生成各種適合分發的數據格式。第二步是和端點實際的共享數據。假設workbook是一個工作簿對象。
nodejs寫入文件 (點擊顯示詳情)
XLSX.writeFile uses fs.writeFileSync in server environments:
if(typeof require !== 'undefined') XLSX = require('xlsx');
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsb');
/* at this point, out.xlsb is a file that you can distribute */
Photoshop ExtendScript 寫入文件 (點擊顯示詳情)
writeFile 把 File包裹在 Photoshop 和 other ExtendScript 目標里面。指定的路徑應該是絕對路徑。
#include "xlsx.extendscript.js"
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsx');
/* at this point, out.xlsx is a file that you can distribute */
extendscript 示例包含有更復雜的例子。
瀏覽器將TABLE元素添加到頁面 (點擊顯示詳情)
sheet_to_html工具函數生成能被添加到任意DOM元素的HTML代碼。
var worksheet = workbook.Sheets[workbook.SheetNames[0]];
var container = document.getElementById('tableau');
container.innerHTML = XLSX.utils.sheet_to_html(worksheet);
瀏覽器上傳文件(ajax) (點擊顯示詳情)
用 XHR 的完整的復雜示例可以在 XHR示例 中查看,獲取和包裝器庫的例子也可以包含在里面。例子中假設服務器能處理Base64編碼的文件(查看基本的莫得服務器示例)。
/* in this example, send a base64 string to the server */
var wopts = {
bookType:'xlsx', bookSST:false, type:'base64' };
var wbout = XLSX.write(workbook,wopts);
var req = new XMLHttpRequest();
req.open("POST", "/upload", true);
var formdata = new FormData();
formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name
formdata.append('data', wbout); // <-- `data` holds the base64-encoded data
req.send(formdata);
瀏覽器保存文件 (點擊顯示詳情)
XLSX.writeFile 包含了一些用于觸發文件保存的方法。
URL瀏覽器API為文件創建一個URL對象,通過創建a標簽并給他添加click事件就可以使用URL對象。現代瀏覽器都支持這個方法。msSaveBlob是IE10及IE10以上用來觸發文件保存的API。- 對于Windows XP 和 Windows 7里面的IE6和IE6以上的以上瀏覽器,
IE_FileSave使用 VBScript 和 ActiveX 來寫入文件。s補充程序(shim)必須包含在包含的HTML頁面中。
并沒有標準的方法判斷是否真實的文件已經被下載了。
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsb');
/* at this point, out.xlsb will have been downloaded */
瀏覽器保存文件(兼容性) (點擊顯示詳情)
XLSX.writeFile方法在大多數的現代瀏覽器以及老版本的瀏覽器中都能使用。對于更老的瀏覽器,wrapper庫里面有變通的方法可以應用。
FileSaver.js 執行 saveAs方法。
注意:如果saveAs方法可以使用,XLSX.writeFile會自動調用。
/* bookType can be any supported output type */
var wopts = {
bookType:'xlsx', bookSST:false, type:'array' };
var wbout = XLSX.write(workbook,wopts);
/* the saveAs call downloads a file on the local machine */
saveAs(new Blob([wbout],{
type:"application/octet-stream"}), "test.xlsx");
Downloadify使用Flash SWF按鈕生成本地文件,即使是ActiveX不能使用的環境也適用。
Downloadify.create(id,{
/* other options are required! read the downloadify docs for more info */
filename: "test.xlsx",
data: function() {
return XLSX.write(wb, {
bookType:"xlsx", type:'base64'}); },
append: false,
dataType: 'base64'
});
oldie示例展示了IE向后兼容的場景。
included demos包含了移動app和其他專門的部署。
寫入示例
- http://sheetjs.com/demos/table.html 導出一個 HTML table
- http://sheetjs.com/demos/writexlsx.html 生成一個簡單文件
流式寫入
XLSX.stream對象中可以使用流式寫入函數。流式函數像普通的函數一樣傳入相同的參數,不過返回一個可讀流。但是他們只暴露在Nodejs中。
XLSX.stream.to_csv是XLSX.utils.sheet_to_csv的流式版本。XLSX.stream.to_html是XLSX.utils.sheet_to_html的流式版本。XLSX.stream.to_json是XLSX.utils.sheet_to_json的流式版本。
nodejs轉換成CSV并寫入文件 (點擊顯示詳情)
var output_file_name = "out.csv";
var stream = XLSX.stream.to_csv(worksheet);
stream.pipe(fs.createWriteStream(output_file_name));
nodejs將JSON流輸出到屏幕 (點擊顯示詳情)
/* to_json returns an object-mode stream */
var stream = XLSX.stream.to_json(worksheet, {
raw:true});
/* the following stream converts JS objects to text via JSON.stringify */
var conv = new Transform({
writableObjectMode:true});
conv._transform = function(obj, e, cb){
cb(null, JSON.stringify(obj) + "\n"); };
stream.pipe(conv); conv.pipe(process.stdout);
https://github.com/sheetjs/sheetaki pips將可寫流寫入nodejs響應。
接口
XLSX是瀏覽器暴露出來可以使用的方法,導出到node中能夠使用的XLSX.version是XLSX庫的版本(通過構建腳本添加)。XLSX.SSF是格式化庫的嵌入版本。
解析函數
XLSX.read(data, read_opts) 用來解析數據 data。
XLSX.readFile(filename, read_opts) 用來讀取文件名 filename 并且解析。解析選項會在解析選項部分闡述。
寫入函數
XLSX.write(wb, write_opts) 用來寫入工作簿 wb。
XLSX.writeFile(wb, filename, write_opts) 把 wb 寫入到特定的文件 filename 中。如果是基于瀏覽器的環境,此函數會強制瀏覽器端下載。
XLSX.writeFileAsync(filename, wb, o, cb) 把 wb 寫入到特定的文件 filename 中。如果 o 被省略,寫入函數會使用第三個參數作為回調函數。
XLSX.stream 包含一組流式寫入函數的集合。
寫入選項會在寫入選項部分部分進行闡述。
工具
XLSX.utils對象中的工具函數都可以使用,工具函數在工具函數部分進行闡述。
導入:
aoa_to_sheet把轉換JS數據數組的數組為工作表。json_to_sheet把JS對象數組轉換為工作表。table_to_sheet把DOM TABLE元素轉換為工作表。sheet_add_aoa把JS數據數組的數組添加到已存在的工作表中。sheet_add_json把JS對象數組添加到已存在的工作表中。
導出:
sheet_to_json把工作表轉換為JS對象數組。sheet_to_csv生成分隔符隔開值的輸出。sheet_to_txt生成UTF16格式化的文本。sheet_to_html生成HTML輸出。sheet_to_formulae生成公式列表(帶有值回退)。
單元格和單元格地址的操作:
format_cell生成文本類型的單元格值(使用數字格式)。encode_row / decode_row在0索引行和1索引行之間轉換。encode_col / decode_col在0索引列和列名之間轉換。encode_cell / decode_cell轉換單元格地址。encode_range / decode_range轉換單元格的范圍。
常用的數據表格式(Common Spreadsheet Format)
js-xlsx符合常用的數據表格式(CSF)。
一般結構
單元格地址對象的存儲格式為{c:C, r:R},其中C和R分別代表的是0索引列和行號。例如單元格地址B5用對象{c:1, r:4}表示。
單元格范圍對象存儲格式為{s:S, e:E},其中S是第一個單元格,E是最后一個單元格。范圍是包含關系。例如范圍 A3:B7用對象{s:{c:0, r:2}, e:{c:1, r:6}}表示。當遍歷數據表范圍時,工具函數執行行優先命令。
for(var R = range.s.r; R <= range.e.r; ++R) {
for(var C = range.s.c; C <= range.e.c; ++C) {
var cell_address = {
c:C, r:R};
/* if an A1-style address is needed, encode the address */
var cell_ref = XLSX.utils.encode_cell(cell_address);
}
}
單元格對象
單元格對象是純粹的JS對象,它的keys和values遵循下列的約定:
| Key | Description |
|---|---|
v |
原始值(查看數據類型部分獲取更多的信息) |
w |
格式化文本(如果可以使用) |
t |
內行: b Boolean, e Error, n Number, d Date, s Text, z Stub |
f |
單元格公式編碼為A1樣式的字符串(如果可以使用) |
F |
如果公式是數組公式,則包圍數組的范圍(如果可以使用) |
r |
富文本編碼 (如果可以使用) |
h |
富文本渲染成HTML (如果可以使用) |
c |
與單元格關聯的注釋 |
z |
與單元格關聯的數字格式字符串(如果有必要) |
l |
單元格的超鏈接對象 (.Target 長聯接, .Tooltip 是提示消息) |
s |
單元格的樣式/主題 (如果可以使用) |
如果w文本可以使用,內置的導出工具(比如CSV導出方法)就會使用它。要想改變單元格的值,在打算導出之前確保刪除cell.w(或者設置 cell.w為undefined)。工具函數會根據數字格式(cell.z)和原始值(如果可用)重新生成w文本。
真實的數組公式存儲在數組范圍中第一個單元個的f字段內。此范圍內的其他單元格會省略f字段。
數據類型
原始值被存儲在v值屬性中,用來解釋基于t類型的屬性。這樣的區別允許用于數字和數字類型文本的展示。下面有6種有效的單元格類型。
| Type | Description |
|---|---|
b |
Boolean: 值可以理解為JS boolean |
e |
Error: 值是數字類型的編碼,而且w屬性存儲共同的名稱 ** |
n |
Number: 值是JS number ** |
d |
Date: 值是 JS Date 對象或者是被解析為Date的字符串 ** |
s |
Text: 值可以理解為 JS string 并且被寫成文本 ** |
z |
Stub: 被數據處理工具函數忽略的空白子單元格 ** |
Error 值以及含義 (點擊顯示詳情)
| Value | Error 含義 |
|---|---|
0x00 |
#NULL! |
0x07 |
#DIV/0! |
0x0F |
#VALUE! |
0x17 |
#REF! |
0x1D |
#NAME? |
0x24 |
#NUM! |
0x2A |
#N/A |
0x2B |
#GETTING_DATA |
n表示Number類型。n包括了所有被Excel存儲為數字的數據表,比如dates/times和Boolean字段。Excel專門使用能夠被IEEE754浮點數表示的數據,比如JS Number,所以字段 v 保存原始數字。w字段保持格式化文本。Dates 默認存儲為數字,使用XLSX.SSF.parse_date_code進行轉換。
類型 d表示日期類型,只有當選項為cellDates才會生成日期類型。因為JSON沒有普通的日期類型,所以希望解析器存儲的日期字符串像從date.toISOString()中獲取的一樣。另一方面,寫入函數和導出函數也可以處理日期字符串和JS日期對象。需要注意Excel會忽略時區修飾符,并且處理所有本地時區的日期。代碼庫沒有改正這個錯誤。
類型z表示空白的存根單元格。生成存根單元格是為了以防萬一單元格沒有被賦予指定值,但是保留了注釋或者是其他的元數據。存根單元格會被核心庫的數據處理工具函數忽略。默認情況下不會生成存根單元格,只有當解析器sheetStubs的選項被設為true時才會生成。
日期
Excel 日期編碼的細節 (點擊顯示詳情)
默認情況下,Excel把日期存儲為數字,并用指定的日期處理格式編碼進行處理。例如,日期19-Feb-17被存儲為數字42785,數字格式為d-mmm-yy。SSF模塊了解數字格式并進行適當的轉換。
XSLX也支持特定的日期類型d,它的數據是ISO 8601日期字符串。格式化工具把日期還原為數字。
所有解析器的默認行為是生成數字單元格。設置cellDates為true會強制生成器存儲日期。
時區和日期 (點擊顯示詳情)
Excel沒有原生的通用時間的概念。所有的時間都會在本地時區指定。Excel限制指定真正的絕對日期。
對于下面的Excel,代碼庫將所有的日期視為相對于當地時區的日期。
時期:1900年和1904年 (點擊顯示詳情)
Excel支持兩種時期(January 1 1900和January 1 1904),查看“1900 vs. 1904 Date System” article。工作簿的時期可以通過測試工作簿的wb.Workbook.WBProps.date1904屬性來決定:
!!(((wb.Workbook||{
}).WBProps||{
}).date1904)
數據表對象
每一個不以!開始的key都會映射到一個單元格(用A-1符合)。sheet[address] 返回指定地址的單元格對象。
指定的數據表屬性(通過 sheet[key]訪問, 每一個都以 !開始):
sheet['!ref']:A-1的范圍是基于表示數據表的范圍。操作數據表的函數應該使用這個參數來決定操作范圍。此范圍之外指定的單元格不會被處理。尤其是手動編寫數據表時,范圍之外的單元格不會被包含在其中。
處理數據表的函數應該對!ref的存在進行檢測。如果!ref被忽略或者不是有效的范圍,函數就可以吧數據表看做是空表或者嘗試猜范圍。詞庫附帶的工具函數會將工作表視為空(例如CSV的輸出是空字符串)。
當用sheetRows屬性集讀取工作表時,ref參數會使用限制的范圍。最初的范圍通過ws['!fullref']設置。
sheet['!margins']:sheet['!margins']對象表示頁面的邊距。默認值遵循Excel的常規設置。Excel也有”wide”和”narrow”的設置,不過他們都被存儲為原生的尺寸。主要的屬性已在下表列出:
頁面邊距詳情 (點擊顯示詳情)
| key | description | “normal” | “wide” | “narrow” |
|---|---|---|---|---|
left |
left margin (inches) | 0.7 |
1.0 |
0.25 |
right |
right margin (inches) | 0.7 |
1.0 |
0.25 |
top |
top margin (inches) | 0.75 |
1.0 |
0.75 |
bottom |
bottom margin (inches) | 0.75 |
1.0 |
0.75 |
header |
header margin (inches) | 0.3 |
0.5 |
0.3 |
footer |
footer margin (inches) | 0.3 |
0.5 |
0.3 |
/* Set worksheet sheet to "normal" */
ws["!margins"]={
left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
/* Set worksheet sheet to "wide" */
ws["!margins"]={
left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
/* Set worksheet sheet to "narrow" */
ws["!margins"]={
left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}
工作表對象
除了基本的數據表關鍵字之外,工作表還增加了下面的內容:
-
ws['!cols']:返回列屬性對象的數組。實際上的列寬使用統一的方式存儲在文件里,寬度的測量依據最大數字寬度(在像素中,最大的渲染寬度是數字0-9)。渲染時,列對象用wpx字段存儲像素寬度,用wch存儲字符寬度,用MDW字段存儲最大數字寬度。 -
ws['!rows']: 返回行屬性對象的數組,后面的文檔會進行闡述。每一個行對象編碼屬性包括行高和能見度。 -
ws['!merges']: 返回與工作表中合并單元格相對應的范圍對象的數組。純文本格式不支持合并單元格。如果合并的單元格存在,CSV導出將會把所有的單元格寫入合并范圍,因此確保在合并的范圍內只有第一個單元格(左上角的單元格)被設置。 -
ws['!protect']: 寫入數據表保護屬性的對象。password鍵為支持密碼保護的數據表(XLSX/XLSB/XLS)指定密碼。寫入函數會使用XOR模糊方式。下面key控制數據表保護–數據表被鎖定時設置key為false可以使用feature,或者設為true禁用feature。
工作表保護詳情 (點擊顯示詳情)
| key | feature (true=disabled / false=enabled) | default |
|---|---|---|
selectLockedCells |
Select locked cells | enabled |
selectUnlockedCells |
Select unlocked cells | enabled |
formatCells |
Format cells | disabled |
formatColumns |
Format columns | disabled |
formatRows |
Format rows | disabled |
insertColumns |
Insert columns | disabled |
insertRows |
Insert rows | disabled |
insertHyperlinks |
Insert hyperlinks | disabled |
deleteColumns |
Delete columns | disabled |
deleteRows |
Delete rows | disabled |
sort |
Sort | disabled |
autoFilter |
Filter | disabled |
pivotTables |
Use PivotTable reports | disabled |
objects |
Edit objects | enabled |
scenarios |
Edit scenarios | enabled |
ws['!autofilter']: 自動篩選下面的模式:
type AutoFilter = {
ref:string; // A-1 based range representing the AutoFilter table range
}
圖表對象
圖表會被顯示為標準的數據表。要注意和!type被設置為"chart"的屬性進行區分。
底層數據和!ref指的是圖表中的緩存數據。 圖表的第一行是底層標題。
宏對象
宏對象會被顯示為標準的數據表。注意與!type設置為"macro"的屬性進行區分。
對話框對象
對話框對象會被顯示為標準的數據表。注意與!type設置為"dialog"的屬性進行區分。
工作簿對象
workbook.SheetNames 是工作簿內工作表的有序列表。
wb.Sheets[sheetname] 返回一個表示工作表的對象。
wb.Props 是一個存儲標準屬性的對象。wb.Custprops 存儲自定義的屬性。因為XLS標準屬性偏離了XLSX標準,所以XLS解析把核心的屬性存儲在兩個屬性中。
wb.Workbook 存儲工作簿級別的特性.
工作簿文件屬性
各種各樣的文件格式為不同的文件屬性使用不同的內置名稱。工作簿的Props對象用來規范這些名稱。
文件屬性 (點擊顯示詳情)
| JS Name | Excel Description |
|---|---|
Title |
Summary tab “Title” |
Subject |
Summary tab “Subject” |
Author |
Summary tab “Author” |
Manager |
Summary tab “Manager” |
Company |
Summary tab “Company” |
Category |
Summary tab “Category” |
Keywords |
Summary tab “Keywords” |
Comments |
Summary tab “Comments” |
LastAuthor |
Statistics tab “Last saved by” |
CreatedDate |
Statistics tab “Created” |
例如設置工作簿的title屬性:
if(!wb.Props) wb.Props = {
};
wb.Props.Title = "Insert Title Here";
自定義的屬性會被添加到工作簿的Custom對象中:
if(!wb.Custprops) wb.Custprops = {
};
wb.Custprops["Custom Property"] = "Custom Value";
寫入函數將會處理選項對象的Props鍵:
/* force the Author to be "SheetJS" */
XLSX.write(wb, {
Props:{
Author:"SheetJS"}});
工作簿級別的特性
wb.Workbook 存儲工作簿級別的特性。
定義名稱
wb.Workbook.Names 是一個定義名稱對象的數組,這些名稱對象都有鍵:
定義名稱屬性 (點擊顯示)
| Key | Description |
|---|---|
Sheet |
名稱的范圍。 數據表的索引 (0 = 第一章張數據表) 或null (工作簿) |
Name |
區分大小寫的名稱。 標準的規則應用** |
Ref |
A1單元格樣式的引用 ("Sheet1!$A$1:$D$20") |
Comment |
注釋 (只適用于XLS/XLSX/XLSB) |
Excel 允許兩個表格范圍定義的名稱共享相同的名稱。但是一個表格范圍的名稱不能和一個工作簿范圍的名稱相沖突。工作簿寫入函數不強制這樣的約束。
工作簿視圖
wb.Workbook.Views 是一個工作簿視圖對象數組,這些視圖對象有keys。
| Key | Description |
|---|---|
RTL |
如果值為true,從左到右的顯示 |
混合的工作簿屬性
| Key | Description |
|---|---|
CodeName |
VBA Project Workbook Code Name |
date1904 |
時間: 0/false 表示1900系統時間, 1/true 表示1904系統時間 |
filterPrivacy |
警告或去除存儲的個人驗證信息 |
文檔特點
即使是想存儲數據這樣的基本特點,官方的Excel格式也會用不同的方式存儲相同的內容。期望解析器從底層文件格式轉換為通用的電子表格格式。期望編寫器將CSF格式轉換回基本的文件格式。
公式
A1單元格樣式字符串被存儲在f字段中。雖然不同的文件格式用不同的方式存儲文件格式,不過這些格式都需要被翻譯。雖然一些格式存儲的公式有一個前導等號,但是CSF公式不以=開始。
A1=1, A2=2, A3=A1+A2的顯示 (點擊展示詳情)
{
"!ref": "A1:A3",
A1: {
t:'n', v:1 },
A2: {
t:'n', v:2 },
A3: {
t:'n', v:3, f:'A1+A2' }
}
共享的公式會被解壓縮,并且每一個單元格都有相應的公式。編寫器通常不會嘗試去生成共享公式。
有公式記錄但是沒有值的單元格會被序列化,序列化的方式能夠被Excel和其他電子表格工具將會識別。這個代碼庫將不會自動計算公式結果!例如去計算工作表中的BESSELJ。
沒有已知值的公式 (點擊顯示詳情)
{
"!ref": "A1:A3",
A1: {
t:'n', v:3.14159 },
A2: {
t:'n', v:2 },
A3: {
t:'n', f:'BESSELJ(A1,A2)' }
}
數組公式
數組公式被存儲在數組塊左上角的單元格內。一個數組公式的所有單元格都會有于該范圍對應的F字段。一個單一的單元格公式要注意于F字段所存儲的純公式進行區分。
數組公式示例 (點擊顯示詳情)
例如設置單元格C1為數組公式{=SUM(A1:A3*B1:B3)}:
worksheet['C1'] = {
t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };
對于多個單元格的數組公式,每一個單元格都有相同的數組范圍,不過只有第一個單元格指定公式。考慮D1:D3=A1:A3*B1:B3:
worksheet['D1'] = {
t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
worksheet['D2'] = {
t:'n', F:"D1:D3" };
worksheet['D3'] = {
t:'n', F:"D1:D3" };
工具函數和編寫器被用來檢查F字段的存在,并且忽略單元格內任何可能的公式元素f,這些單元格并不包含起始單元格。這些操作函數并不會被要求執行公式的校驗。
公式輸出工具函數 (點擊顯示詳情)
sheet_to_formulae方法生成為每個公式或者是數組公式生成一行。數組公式被渲染在range=formula的表格內,而純單元格被渲染在cell=formula or value的表格內。注意字符串的迭代會有前綴符號',與Excel公式欄顯示的一致。
公式文件格式細節 (點擊顯示詳情)
| Storage Representation | Formats | Read | Write |
|---|---|---|---|
| A1-style strings | XLSX | ⭕️ | ⭕️ |
| RC-style strings | XLML and plain text | ⭕️ | ⭕️ |
| BIFF Parsed formulae | XLSB and all XLS formats | ⭕️ | |
| OpenFormula formulae | ODS/FODS/UOS | ⭕️ | ⭕️ |
因為Excel禁止單元格的命名與A1的名稱或者是RC樣式單元格引用相沖突,可能會進行不是那么簡單的正則變化。DIFF解析的公式必須被明確的解開。OpenFormula可以轉換正則表達式。
列屬性
每張表都會有!cols數組,如果展開的話就是ColInfo的一個集合,有下列的屬性:
type ColInfo = {
/* visibility */
hidden?: boolean; // if true, the column is hidden
/* column width is specified in one of the following ways: */
wpx?: number; // width in screen pixels
width?: number; // width in Excel's "Max Digit Width", width*256 is integral
wch?: number; // width in characters
/* other fields for preserving features from files */
MDW?: number; // Excel's "Max Digit Width" unit, always integral
};
為什么有三種寬度類型? (點擊顯示詳情) 有三種不同的寬度類型對應于電子數據表存儲列寬的三種不同方式。
SYLK和其他的純文本格式使用原生的字符計算。像Visicalc和Multiplan這樣的同時期的工具是基于字符的。因為字符有相同的寬度,足以存儲一個計數。這樣的傳統也延續到了BIFF格式。
SpreadsheetML (2003) 嘗試通過標準化整個文件中的屏幕像素計數來與HTML對齊。列寬、行高以及其他的測量使用像素。當像素和字符數量不一致時,Excel四舍五入結果。
XLSX內部用一個模糊的”最大數位寬度”表存儲列寬。最大數字寬度是渲染時最大數字的寬度,通常字符”0″是最寬的。內部的寬度必須是寬度除以256的整數倍。ECMA-376介紹了一個公式用于像素和內部寬度之間的轉換。這代表一種混合的方式。
讀取函數嘗試去填充全部的三種屬性。寫函數努力嘗試將指定值循環到所需類型。為了阻止潛在的沖突。首先操作應該要刪除其他的屬性。列入,當改變像素寬度時,刪除wch 和 width屬性。
執行細節 (點擊顯示詳情)
給出的這些約束可能決定了MDW沒有檢查字體!解析器通過從寬度轉換為像素并返回來猜測像素寬度,重復所有可能的MDW并選擇最小化村務的MDW。XLML實際上存儲額像素寬度,所以猜想會在相反的方向運行。
即使所有的信息都是可用的,也會期望寫入函數遵循下面的優先級順序:
- 如果
width字段可用,優先使用width。 - 如果
wpx字段可用,請使用wpx。 - 如果
wch字段可用,請使用wch。
行屬性
如果!rows 數組在每張電子表中都存在,那就是一個RowInfo對象的集合,集合包含一下的屬性:
type RowInfo = {
/* visibility */
hidden?: boolean; // if true, the row is hidden
/* row height is specified in one of the following ways: */
hpx?: number; // height in screen pixels
hpt?: number; // height in points
level?: number; // 0-indexed outline / group level
};
注意:Excel UI顯示基本大綱級別為1,最大級別為8。level字段存儲基本大綱級別為0,最大級別為7。
實現細節 (點擊展示詳情)
Excel內部以點為單位存儲行高。默認的分辨率是72DPI或者是96DPI,所以像素和點的大小應該相同。不同的分辨率他們可能不同,因此庫分開了這些概念:
即使所有的信息都可用,寫入函數也應該遵循下面的優先級順序:
1)如果hpx可用,就使用 hpx像素高度。
2) 如果hpx可用,就使用 hpx像素高度。
數字格式
對于每一個單元格而言,cell.w的文本來自于cell.v 和 cell.z格式。如果格式沒有指定,ExcelGeneral格式就會被使用。格式要么是指定的的字符串要么是格式表內的一個索引。解析器應該用數字格式表來填充workbook.SSF。寫入函數用來序列化這個表。
自定義的工具應該確保本地表的表內有各自的格式字符串。Excel約定規定自定義的格式以索引164開頭。下面的例子從頭創建了一個自定義的格式:
自定義格式的新工作簿 (點擊顯示詳情)
var wb = {
SheetNames: ["Sheet1"],
Sheets: {
Sheet1: {
"!ref":"A1:C1",
A1: {
t:"n", v:10000 }, // <-- General format
B1: {
t:"n", v:10000, z: "0%" }, // <-- Builtin format
C1: {
t:"n", v:10000, z: "\"T\"\ #0.00" } // <-- Custom format
}
}
}
這些規則和Excel如何顯示自定義的數字格式稍微有些區別。特別是文字字符必須必包含在雙引號里面或者在反斜杠之前。更多信息,查看Excel文檔Create or delete a custom number format 或者是ECMA-376 18.8.31(數字格式)。
默認的數字格式 (點擊展示詳情)
ECMA-376 18.8.30里列出的默認格式:
| ID | Format |
|---|---|
| 0 | General |
| 1 | 0 |
| 2 | 0.00 |
| 3 | #,##0 |
| 4 | #,##0.00 |
| 9 | 0% |
| 10 | 0.00% |
| 11 | 0.00E+00 |
| 12 | # ?/? |
| 13 | # ??/?? |
| 14 | m/d/yy (see below) |
| 15 | d-mmm-yy |
| 16 | d-mmm |
| 17 | mmm-yy |
| 18 | h:mm AM/PM |
| 19 | h:mm:ss AM/PM |
| 20 | h:mm |
| 21 | h:mm:ss |
| 22 | m/d/yy h:mm |
| 37 | #,##0 ;(#,##0) |
| 38 | #,##0 ;[Red](#,##0) |
| 39 | #,##0.00;(#,##0.00) |
| 40 | #,##0.00;[Red](#,##0.00) |
| 45 | mm:ss |
| 46 | [h]:mm:ss |
| 47 | mmss.0 |
| 48 | ##0.0E+0 |
| 49 | @ |
格式14(m/d/yy)被Excel本地化:即使文件指明了數字格式,也會根據系統設置用不同的方式繪制。當文件的的生產者和使用者都在相同的區域時這會很有用,不過對于網絡上的例子就會不同。為了避免歧義,解析函數接受dateNF選項覆蓋指定格式字符串的解釋。
超鏈接
超鏈接存儲在單元格對象的l關鍵字內。超鏈接對象的Target字段是連接目標,包括了URI片段。工具提示被存儲在Tooltip字段內,當移動鼠標到文字上方就會顯示。
例如下方的片段在單元格A3內創建了一個指向http://sheetjs.com的鏈接,提示信息是"Find us @ SheetJS.com!":
ws['A3'].l = {
Target:"http://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };
注意Excel并不會自動為超鏈接添加樣式–他們通常會向普通文本一樣顯示。
如果鏈接的目標是一個單元格或者是范圍又或者是在相同的工作簿內定義名字(“Internal Links”),那么鏈接的開頭會有一個哈希字符標識:
ws['A2'].l = {
Target:"#E2" }; /* link to cell E2 */
單元格注釋
單元格注釋是對象,被存儲在單元格對象的c數組內。實際上注釋的內容根據注釋的作者被分成了小塊。每一個注釋對象的a字段存儲注釋的作者,t字段是注釋的純文字展示。
例如下面的片段在單元格A1內添加了單元格注釋:
if(!ws.A1.c) ws.A1.c = [];
ws.A1.c.push({
a:"SheetJS", t:"I'm a little comment, short and stout!"});
注意:XLSB對作者的名字施加54個字符的限制。名字的長度超過54個字符可能造成其他的格式問題。
把注釋標記為普通的隱藏,只需設置hidden屬性:
if(!ws.A1.c) ws.A1.c = [];
ws.A1.c.push({
a:"SheetJS", t:"This comment is visible"});
if(!ws.A2.c) ws.A2.c = [];
ws.A2.c.hidden = true;
ws.A2.c.push({
a:"SheetJS", t:"This comment will be hidden"});
數據表能見度
Excel支持將表格隱藏在更低的標簽欄。表格數據存儲文件內,但是UI不容易讓它可以使用。標準的隱藏表格會被顯示在”Unhide”菜單內。Excel也有”very hidden”表格,這些表格不能被顯示在菜單內。只可以通過Vb編輯器訪問。
能見度的設置被存儲在表格屬性數組的Hidden屬性當中。
更多細節 (點擊顯示詳情)
| Value | Definition |
|---|---|
| 0 | Visible |
| 1 | Hidden |
| 2 | Very Hidden |
更多詳情請查看https://rawgit.com/SheetJS/test_files/master/sheet_visibility.xlsx:
> wb.Workbook.Sheets.map(function(x) {
return [x.name, x.Hidden] })
[ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]
非Excel格式不支持”Very Hidden”狀態。測試一個數據比哦啊是否可見的最好方式是檢查是否Hidden屬性為邏輯truth:
> wb.Workbook.Sheets.map(function(x) {
return [x.name, !x.Hidden] })
[ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]
VBA和宏命令
VBA宏命令存儲在特殊的數據blob中,當bookVBA選項為true時,blob會暴露在工作簿對象的vbaraw屬性中。VBA宏命令支持 XLSM, XLSB, 和 BIFF8 XLS 格式。如果blob存在于工作簿中,并且和工作簿的名字有關聯,支持的格式寫入函數會自動插入數據blob。
自定義編碼名稱 (點擊顯示)
工作簿編碼名稱存儲在wb.Workbook.WBProps.CodeName中。默認情況下Excel將會設置成ThisWorkbook或者是一個翻譯的短語比如DieseArbeitsmappe。工作表和圖表的編碼名稱在工作表屬性對象的wb.Workbook.Sheets[i].CodeName中。宏數據表和對話數據表會被忽略。
讀取函數和寫入函數會保護編碼名稱,但是當在一個不同的工作簿內增加一個VBA blob時,編碼名稱必須被手動設置。
宏數據表 (點擊顯示)
老版本的Excel也支持非VBA的宏數據表表格類型,宏數據表存儲了一些自動命令。他們暴露在!type設置成"macro"的對象中。
檢測工作簿內宏指令 (點擊顯示) 如果宏指令存在,那么`vbaraw`字段就可以被設置,所以測試簡單:
function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
if(!!wb.vbaraw) return true;
const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
return sheets.some((ws) => !!ws && ws['!type']=='macro');
}
解析選項
導出的read 和 readFile函數接受選項參數:
| Option Name | Default | Description |
|---|---|---|
type |
輸入數據編碼 (查看下方的輸入類型) | |
raw |
false | 如果為true,純文本解析不會解析值 ** |
codepage |
如果指定, 合適的時候使用編碼頁面** | |
cellFormula |
true | 保存公式到f字段 |
cellHTML |
true | 解析富文本并把HTML保存到.h 字段 |
cellNF |
false | 把數字格式的字符串保存到 .z 字段 |
cellStyles |
false | 把樣式/主題保存到 .s 字段 |
cellText |
true | 生成格式化文本.w 字段 |
cellDates |
false | 把日期存儲為類型 d (默認是 n) |
dateNF |
如果指定,使用代碼日期14的字符串 ** | |
sheetStubs |
false | 為子單元格創建z類型的單元格對象 |
sheetRows |
0 | 如果sheetRows的值 >0, 讀取第一個sheetRows 行 ** |
bookDeps |
false | 值為true,解析計算鏈 |
bookFiles |
false | 如果值為true, 添加原始文件到工作簿對象 ** |
bookProps |
false | 如果值為true, 只有足夠的解析才能得到工作簿的元數據** |
bookSheets |
false | 如果值為true,只有足夠的解析才能得到表格名稱 |
bookVBA |
false | 如果值為true,復制 VBA blob 到 vbaraw 字段 ** |
password |
“” | 如果定義了密碼并且文件已經加密,就會使用密碼 ** |
WTF |
false | 如果值為true, 對意外的文件特性拋出錯誤 ** |
- 雖然
cellNF為false,但是格式化的文本也會被生成并且保存到.w字段。 - 在一些情況下,即使
bookSheets為false,數據表也可能被解析。 - Excel積極嘗試從CSV和其他純文本中解釋值。這會導致意外的行為!
raw選項抑制值解析。 bookSheets和bookProps結合起來提供兩套信息集合。Deps將會是一個空對象,如果bookDeps為false。bookFiles的行為依賴于文件類型:keys數組(ZIP里面的路徑)用于基于ZIP基礎的格式files哈希(將路徑映射到表示文件的的對象)用于ZIPcfb對象用于使用CFB容器的格式
sheetRows-1將會在查看JSON對象輸出時生成(因為解析數據時,數據頭行會被計算成一行)bookVBA僅僅在xl/vbaProject.bin展示原始的VBA CFB對象。不解析數據。XLSM 和 XLSB把VBA CFB對象存儲在xl/vbaProject.bin。BIFF8 XLS將VBA條目與核心工作簿條目混合在一起,因此庫從XLS CFB容器生成了一個新的XLSB兼容blob。codepage用于沒有CodePage記錄的BIFF2 – BIFF5文件以及在type:"binary"內沒有BOM的CSV文件。- 目前僅支持XOR加密。當文件使用其他的加密方法時會拋出不支持的錯誤。
- WTF主要用于發展。默認情況下,單一的工作表內,解析器將會抑制讀取錯誤,允許你從解析正確的工作表內讀取。設置
WTF:1強制這些錯誤被拋出。
輸入類型
字符串能用很多種方式解釋。read的type參數告訴庫如何解析數據參數:
type |
expected input |
|---|---|
"base64" |
字符串: 文件的Base64編碼 |
"binary" |
字符串: 二進制字符串 (字節 n 是 data.charCodeAt(n)) |
"string" |
字符串: JS字符串 (字符被解釋為UTF8) |
"buffer" |
nodejs Buffer |
"array" |
數組: 8位的無符號型整數數組 (字節 n 是 data[n]) |
"file" |
字符串: 將要被讀取的文件的路徑 (只在nodejs中可用) |
猜測文件類型
實現細節 (點擊顯示詳情)
Excel和其他的電子數據表格工具讀取前幾個字節并且應用試探法確定穩定類型。這個支持文件類型的雙關:用.xls擴展的重命名文件會告訴你的電腦使用Excel打開文件而且Excel知道如何去處理它。這個庫應用了相似的邏輯:
| Byte 0 | Raw File Type | Spreadsheet Types |
|---|---|---|
0xD0 |
CFB Container | BIFF 5/8 or password-protected XLSX/XLSB or WQ3/QPW |
0x09 |
BIFF Stream | BIFF 2/3/4/5 |
0x3C |
XML/HTML | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
0x50 |
ZIP Archive | XLSB or XLSX/M or ODS or UOS2 or plain text |
0x49 |
Plain Text | SYLK or plain text |
0x54 |
Plain Text | DIF or plain text |
0xEF |
UTF8 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
0xFF |
UTF16 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
0x00 |
Record Stream | Lotus WK* or Quattro Pro or plain text |
0x7B |
Plain text | RTF or plain text |
0x0A |
Plain text | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
0x0D |
Plain text | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
0x20 |
Plain text | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
DBF文件會基于前幾個字節以及第三個和第四個字節進行檢測(對應于文件日期的月和天)。
純文本格式的猜測遵循下面的優先級順序:
| Format | Test |
|---|---|
| XML | <?xml 出現在前1024個字符 |
| HTML | 以 <開頭并且HTML標簽出現在前1024個字符 * |
| XML | 以 <開頭 |
| RTF | 以 {\rt開頭 |
| DSV | 以/sep=.$/開頭,分隔符是指定的字符串 |
| DSV | 前1024個字符中未引用的";" 字符比 "\t" 或者 "," 多 |
| TSV | 前1024個字符中未引用的"\t"字符比 "," 多 |
| CSV | 前1024個字符中的一個是逗號"," |
| ETH | 以socialcalc:version:開頭 |
| PRN | (默認) |
- HTML 標簽包括:
html,table,head,meta,script,style,div
為什么隨機的文本文件合法? (點擊顯示詳情) Excel在讀取文件方面非常積極。添加一個XLS 擴展到任意的顯示文件,讓Excel認為該文件可能是一個CSV或者是TSV文件,即使它僅僅是一列!這個庫嘗試去復制那樣的行為。
最好的方法是去校驗想要得到的工作表并且確保它有期待的行數或列數。提取范圍非常簡單:
var range = XLSX.utils.decode_range(worksheet['!ref']);
var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;
寫入選項
導出的write 和 writeFile函數接受一個選型參數:
| Option Name | Default | Description |
|---|---|---|
type |
輸出數據編碼(查看下面的輸出類型) | |
cellDates |
false |
把字節存儲為類型d (默認是 n) |
bookSST |
false |
生成共享的字符串表格 ** |
bookType |
"xlsx" |
工作簿的類型 (查看下方支持的格式) |
sheet |
"" |
單頁格式的工作表名稱 ** |
compression |
false |
基于ZIP的格式使用ZIP壓縮 ** |
Props |
寫入時覆蓋工作簿的屬性 ** | |
themeXLSX |
寫入XLSX/XLSB/XLSM時,覆蓋主題XML ** | |
ignoreEC |
true |
禁止”數字作為文本”錯誤 ** |
bookSST較慢并且有更多的內存密集型,不過與iOS數字老版本有更好的兼容性。- 原始數據時唯一保證存儲的東西。在README文件中沒有描述的功能可能無法序列化。
cellDates僅用于XLSX輸出并且不能保證與第三方讀取器一起工作。Excel自身不經常用類型d編寫單元格,因此非Excel工具會忽視數據或者是有日期錯誤。Props是一個備份工作簿Props字段的對象。從工作簿文件屬性 部分查看表格。- 如果指定,來自
themeXLSX的字符串會被存儲為XLSX/XLSB/XLSM文件的基本主題(ZIP中的xl / theme / theme1.xml)。 - 由于在程序中有一個bug,一些功能比如”分列”會在忽略錯誤條件的工作表上使Excel崩潰。默認情況下寫入函數將會標記文件忽略錯誤。設置
ignoreEC為false來禁止。
支持的輸出格式
與第三方工具的廣泛兼容性,這個庫支持很多種輸出格式。明確的文件類型被bookType選項控制:
bookType |
file ext | container | sheets | Description |
|---|---|---|---|---|
xlsx |
.xlsx |
ZIP | multi | Excel 2007+ XML Format(XML 格式) |
xlsm |
.xlsm |
ZIP | multi | Excel 2007+ Macro XML Format(宏 XML 格式) |
xlsb |
.xlsb |
ZIP | multi | Excel 2007+ Binary Format(二進制格式) |
biff8 |
.xls |
CFB | multi | Excel 97-2004 Worksheet Format(工作簿格式) |
biff5 |
.xls |
CFB | multi | Excel 5.0/95 Worksheet Format(工作簿格式) |
biff2 |
.xls |
none | single | Excel 2.0 Worksheet Format(工作簿格式) |
xlml |
.xls |
none | multi | Excel 2003-2004 (SpreadsheetML) |
ods |
.ods |
ZIP | multi | OpenDocument Spreadsheet(開放文檔格式的電子表格) |
fods |
.fods |
none | multi | Flat OpenDocument Spreadsheet(平滑的開放文檔格式的電子表格) |
csv |
.csv |
none | single | Comma Separated Values(逗號分隔值) |
txt |
.txt |
none | single | UTF-16 Unicode Text (TXT) |
sylk |
.sylk |
none | single | Symbolic Link (SYLK) |
html |
.html |
none | single | HTML Document |
dif |
.dif |
none | single | Data Interchange Format (DIF) (數據交換格式) |
dbf |
.dbf |
none | single | dBASE II + VFP Extensions (DBF)(dBASE II + VFP擴展) |
rtf |
.rtf |
none | single | Rich Text Format (RTF) |
prn |
.prn |
none | single | Lotus Formatted Text(Lotus格式化文本。) |
eth |
.eth |
none | single | Ethercalc Record Format (ETH)(Ethercalc記錄格式) |
compression僅用于帶ZIP容器的格式。- 格式只支持需要
sheet選型指明工作表的單表。如果字符串為空,就會使用第一張工作表。 - 如果
bookType未指定值,那么writeFile會自動根據文件擴展名來猜測輸出文件格式。他就會在上表中選擇匹配擴展名的第一個格式。
輸出類型
write函數的type參數備份read函數的type參數:
type |
output |
|---|---|
"base64" |
字符串: 文件的Base64編碼 |
"binary" |
字符串: 二進制字符串 (字節 n 是 data.charCodeAt(n)) |
"string" |
字符串: JS 字符串 (字符被解釋成UTF8) |
"buffer" |
nodejs Buffer |
"array" |
ArrayBuffer, 8位無符號整數的回退數組 |
"file" |
字符串: 將要創建的文件的地址(僅用于nodejs) |
工具函數
sheet_to_*函數接受一張工作表以及一個可選的選項對象。
*_to_sheet函數接受一個數據對象以及一個可選的選項對象。
示例都是基于下面的工作表:
XXX| A | B | C | D | E | F | G |
---+---+---+---+---+---+---+---+
1 | S | h | e | e | t | J | S |
2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
數組的數組輸入
XLSX.utils.aoa_to_sheet獲取JS值數組的數組,并且返回一個工作表尋找輸入數據。Numbers,Booleans和Strings都被存儲為相應的樣式。Date被存儲為date或者是numbers。跳過數組孔和顯式“未定義”值。null值可能被剔除。所有其它值存儲為字符串。函數獲取選項參數:
| Option Name | Default | Description |
|---|---|---|
dateNF |
FMT 14 | 字符串輸出使用特定的日期格式 |
cellDates |
false | 存儲日期為類型 d (默認是 n) |
sheetStubs |
false | 為null值創建類型為z的單元格對象 |
例子 (點擊顯示) 生成實例表:
var ws = XLSX.utils.aoa_to_sheet([
"SheetJS".split(""),
[1,2,3,4,5,6,7],
[2,3,4,5,6,7,8]
]);
XLSX.utils.sheet_add_aoa獲取JS值的數組的數組,并且更新一個已存在的工作表對象。它遵循和aoa_to_sheet一樣的過程,并且接受一個選項參數:
| Option Name | Default | Description |
|---|---|---|
dateNF |
FMT 14 | 字符串輸出使用指定的日期格式 |
cellDates |
false | 存儲日期為類型 d (默認是 n) |
sheetStubs |
false | 為null值創建類型為z的單元格對象 |
origin |
只用指定的單元格作為指定的起點 (查看下表) |
origin應該是以下之一:
origin |
Description |
|---|---|
| (cell object) | 使用指定的單元格 (單元格對象) |
| (string) | 使用指定的單元格 (A1樣式的單元格) |
| (number >= 0) | 從指定行的第一列開始 (0索引) |
| -1 | 從第一列開始添加到工作表底部 |
| (default) | 從單元格A1開始 |
示例 (點擊顯示)
考慮工作表:
XXX| A | B | C | D | E | F | G |
---+---+---+---+---+---+---+---+
1 | S | h | e | e | t | J | S |
2 | 1 | 2 | | | 5 | 6 | 7 |
3 | 2 | 3 | | | 6 | 7 | 8 |
4 | 3 | 4 | | | 7 | 8 | 9 |
5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
此工作表可按照順序A1:G1, A2:B4, E2:G4, A5:G5構建:
/* Initial row */
var ws = XLSX.utils.aoa_to_sheet([ "SheetJS".split("") ]);
/* Write data starting at A2 */
XLSX.utils.sheet_add_aoa(ws, [[1,2], [2,3], [3,4]], {
origin: "A2"});
/* Write data starting at E2 */
XLSX.utils.sheet_add_aoa(ws, [[5,6,7], [6,7,8], [7,8,9]], {
origin:{
r:1, c:4}});
/* Append row */
XLSX.utils.sheet_add_aoa(ws, [[4,5,6,7,8,9,0]], {
origin: -1});
對象數組輸入
XLSX.utils.json_to_sheet獲取對象數組并且返回一張基于對象自動生成”headers”的工作表。默認的列順序由第一次出現的字段決定,這些字段通過使用Object.keys得到,不過可以使用選項參數覆蓋。
| Option Name | Default | Description |
|---|---|---|
header |
使用指定的列順序 (默認 Object.keys) |
|
dateNF |
FMT 14 | 字符串輸出使用指定的日期格式 |
cellDates |
false | 存儲日期為類型 d (默認是 n) |
skipHeader |
false | 如果值為true, 輸出不包含header行 |
示例 (點擊顯示)
原始的表單不能以明顯的方法復制,因為JS對象的keys必須是獨一無二的。之后用e_1 和 S_1替換第二個e 和 S。
var ws = XLSX.utils.json_to_sheet([
{
S:1, h:2, e:3, e_1:4, t:5, J:6, S_1:7 },
{
S:2, h:3, e:4, e_1:5, t:6, J:7, S_1:8 }
], {
header:["S","h","e","e_1","t","J","S_1"]});
或者可以跳過header行:
var ws = XLSX.utils.json_to_sheet([
{
A:"S", B:"h", C:"e", D:"e", E:"t", F:"J", G:"S" },
{
A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7 },
{
A: 2, B: 3, C: 4, D: 5, E: 6, F: 7, G: 8 }
], {
header:["A","B","C","D","E","F","G"], skipHeader:true});
XLSX.utils.sheet_add_json獲取一個對象數組,并且更新一個已存在的工作表對象。與json_to_sheet一樣有相同的過程,并且接受一個選項參數:
| Option Name | Default | Description |
|---|---|---|
header |
使用指定的列排序 (默認 Object.keys) |
|
dateNF |
FMT 14 | 字符串輸出使用指定的日期格式 |
cellDates |
false | 把存儲日期為類型 d (默認是 n) |
skipHeader |
false | 如果值為true, 輸出不包含header行 |
origin |
使用指定的單元格作為起點 (查看下方表格) |
origin應該是以下之一:
origin |
Description |
|---|---|
| (cell object) | 使用指定的單元格(單元格對象) |
| (string) | 使用指定的單元格 (A1樣式的單元格) |
| (number >= 0) | 從指定行的第一列開始(0索引) |
| -1 | 從第一列開始添加到工作表底部 |
| (default) | 從單元格A1開始 |
例子 (點擊展示) 考慮工作表:
XXX| A | B | C | D | E | F | G |
---+---+---+---+---+---+---+---+
1 | S | h | e | e | t | J | S |
2 | 1 | 2 | | | 5 | 6 | 7 |
3 | 2 | 3 | | | 6 | 7 | 8 |
4 | 3 | 4 | | | 7 | 8 | 9 |
5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
工作表能夠以A1:G1, A2:B4, E2:G4, A5:G5順序構建:
/* Initial row */
var ws = XLSX.utils.json_to_sheet([
{
A: "S", B: "h", C: "e", D: "e", E: "t", F: "J", G: "S" }
], {
header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true});
/* Write data starting at A2 */
XLSX.utils.sheet_add_json(ws, [
{
A: 1, B: 2 }, {
A: 2, B: 3 }, {
A: 3, B: 4 }
], {
skipHeader: true, origin: "A2"});
/* Write data starting at E2 */
XLSX.utils.sheet_add_json(ws, [
{
A: 5, B: 6, C: 7 }, {
A: 6, B: 7, C: 8 }, {
A: 7, B: 8, C: 9 }
], {
skipHeader: true, origin: {
r: 1, c: 4 }, header: [ "A", "B", "C" ]});
/* Append row */
XLSX.utils.sheet_add_json(ws, [
{
A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 }
], {
header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true, origin: -1});
HTML Table 輸入
XLSX.utils.table_to_sheet獲取一個table DOM元素,并且返回一個工作表尋找輸入的table。Numbers會被解析。所有的數據將會被存儲為字符串。
XLSX.utils.table_to_book基于工作表會產生一個最小的工作簿。
兩個函數接受選項參數:
| Option Name | Default | Description |
|---|---|---|
raw |
如果值為true, 每一個單元格將會保存原始的字符串 | |
dateNF |
FMT 14 | 字符串輸出使用指定的日期格式 |
cellDates |
false | 把日期存儲為類型 d (默認是 n) |
sheetRows |
0 | 如果值 >0, 讀取表格的第一個sheetRows行 |
display |
false | 如果值為true, 隱藏的行和單元格將不會被解析 |
例子 (點擊顯示)
生成示例表單,以HTML table開始:
<table id="sheetjs">
<tr><td>S</td><td>h</td><td>e</td><td>e</td><td>t</td><td>J</td><td>S</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr>
</table>
處理表格:
var tbl = document.getElementById('sheetjs');
var wb = XLSX.utils.table_to_book(tbl);
注意:XLSX.read能夠處理表示為字符串的HTML。
公式輸出
XLSX.utils.sheet_to_formulae生成一個命令數組,命令顯示了一個人會怎樣進入一個應用。每一個入口都是表格A1-cell-address=formula-or-value。字符串文字以”`”為前綴,符合Excel。
例子 (點擊顯示)
示例表:
> var o = XLSX.utils.sheet_to_formulae(ws);
> [o[0], o[5], o[10], o[15], o[20]];
[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]
定界分隔符輸出
作為一個writeFile CSV 類型的替代,XLSX.utils.sheet_to_csv也會產生CSV輸出。這個函數獲取一個選項參數:
| Option Name | Default | Description |
|---|---|---|
FS |
"," |
“字段分隔符”表示字段之間的分隔符 |
RS |
"\n" |
“記錄分隔符”表示行之間的分隔符 |
dateNF |
FMT 14 | 字符串輸出使用指定的日期格式 |
strip |
false | 刪除每條記錄中的尾隨字段分隔符** |
blankrows |
true | 包含CSV輸出的空白行 |
skipHidden |
false | 跳過CSV輸出的隱藏行/列 |
strip將刪除默認FS / RS下每行的尾隨逗號
blankrows必須設置為false才能跳過空白行。
例子 (點擊顯示)
示例表:
> console.log(XLSX.utils.sheet_to_csv(ws));
S,h,e,e,t,J,S
1,2,3,4,5,6,7
2,3,4,5,6,7,8
> console.log(XLSX.utils.sheet_to_csv(ws, {
FS:"\t"}));
S h e e t J S
1 2 3 4 5 6 7
2 3 4 5 6 7 8
> console.log(XLSX.utils.sheet_to_csv(ws,{
FS:":",RS:"|"}));
S:h:e:e:t:J:S|1:2:3:4:5:6:7|2:3:4:5:6:7:8|
#### UTF-16 Unicode 文本
txt輸出類型使用tab字符作為字段分隔符。如果codepage可用(包含全部的分發但不是核心),輸出將會被編碼為CP1200并且BOM會被預置。
XLSX.utils.sheet_to_txt獲取和sheet_to_csv一樣的參數。
HTML 輸出
作為’ writeFile ’ HTML類型的替代,XLSX.utils.sheet_to_html也會生成HTML輸出。這個函數接受一個選項參數:
| Option Name | Default | Description |
|---|---|---|
id |
為TABLE元素指定 id 特性 |
|
editable |
false | 如果值為true, 為每一個TD設置 contenteditable="true" |
header |
覆蓋 header (默認 html body) |
|
footer |
覆蓋 footer (默認 /body /html) |
例子 (點擊顯示)
示例表格:
> console.log(XLSX.utils.sheet_to_html(ws));
// ...
JSON
XLSX.utils.sheet_to_json生成不同類型的JS對象。這個函數接受一個選項參數:
| Option Name | Default | Description |
|---|---|---|
raw |
true |
使用原生值 (true) 或者格式化字符串 (false) |
range |
from WS | 覆蓋 Range (查看下面的table) |
header |
控制輸出格式 (查看下面的table) | |
dateNF |
FMT 14 | 字符串輸出使用指定的日期格式 |
defval |
使用指定的值替代null或者undefined | |
blankrows |
** | 包含輸出的空白行 ** |
raw只影響有格式編碼(.z)字段或者格式化文本(.w)字段的單元格。- 如果
header被指定,第一行就會被當做數據行;如果header未指定,第一行是header并且不作為數據。 - 當header未指定時,轉換將通過添加”_”和一個從”1″開始的計數自動消除標題條目的歧義。例如有三列的標題都是
foo,那么輸出字段是foo1,foo_1,foo_2。 - 當
raw值為true時返回null,raw值為false會被跳過。 - 如果
defval沒有指定,通常null和undefined會被跳過。如果defval有指定值,所有的null和undefined嗲都將會用defval填充。 - 當
header為1時,默認生成空白行。blankrows必須設置為false來跳過空白行。 - 當
header不為1時,默認跳過空白行。blankrows必須設置為true來生成空白行。
range是以下之一:
range |
Description |
|---|---|
| (number) | 使用工作表范圍,但將起始行設置為值 |
| (string) | 使用指定的范圍 (A1類型的有界范圍的字符串) |
| (default) | 使用工作表范圍 (ws['!ref']) |
header是以下之一:
header |
Description |
|---|---|
1 |
生成數組類型的數組 (“二維數組”) |
"A" |
行對象的鍵是文字的列標題 |
| array of strings | 在行對象內使用指定的字符串作為鍵 |
| (default) | 讀取并消除第一行的歧義作為鍵 |
如果header不為1,行對象將會包含不可枚舉的屬性“rowNum`,這個屬性代表與條目相對應的工作表的行。
示例 (點擊顯示) 示例表:
> XLSX.utils.sheet_to_json(ws);
[ {
S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
{
S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ]
> XLSX.utils.sheet_to_json(ws, {
header:"A"});
[ {
A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' },
{
A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' },
{
A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ]
> XLSX.utils.sheet_to_json(ws, {
header:["A","E","I","O","U","6","9"]});
[ {
'6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' },
{
'6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' },
{
'6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ]
> XLSX.utils.sheet_to_json(ws, {
header:1});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
[ '1', '2', '3', '4', '5', '6', '7' ],
[ '2', '3', '4', '5', '6', '7', '8' ] ]
展示row效果的例子:
> ws['A2'].w = "3"; // set A2 formatted string value
> XLSX.utils.sheet_to_json(ws, {
header:1, raw:false});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
[ '3', '2', '3', '4', '5', '6', '7' ], // <-- A2 uses the formatted string
[ '2', '3', '4', '5', '6', '7', '8' ] ]
> XLSX.utils.sheet_to_json(ws, {
header:1});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
[ 1, 2, 3, 4, 5, 6, 7 ], // <-- A2 uses the raw value
[ 2, 3, 4, 5, 6, 7, 8 ] ]
文件格式
雖然庫的名稱是xlsx,不過它支持多種電子表格文件格式:
| Format | Read | Write |
|---|---|---|
| Excel Worksheet/Workbook Formats | :—–: | :—–: |
| Excel 2007+ XML Formats (XLSX/XLSM) | ⭕️ | ⭕️ |
| Excel 2007+ Binary Format (XLSB BIFF12) | ⭕️ | ⭕️ |
| Excel 2003-2004 XML Format (XML “SpreadsheetML”) | ⭕️ | ⭕️ |
| Excel 97-2004 (XLS BIFF8) | ⭕️ | ⭕️ |
| Excel 5.0/95 (XLS BIFF5) | ⭕️ | ⭕️ |
| Excel 4.0 (XLS/XLW BIFF4) | ⭕️ | |
| Excel 3.0 (XLS BIFF3) | ⭕️ | |
| Excel 2.0/2.1 (XLS BIFF2) | ⭕️ | ⭕️ |
| Excel支持的文本格式 | :—–: | :—–: |
| Delimiter-Separated Values(定界分隔符的值 ) (CSV/TXT) | ⭕️ | ⭕️ |
| Data Interchange Format(數據交換格式 (DIF) | ⭕️ | ⭕️ |
| Symbolic Link(符號鏈接) (SYLK/SLK) | ⭕️ | ⭕️ |
| Lotus Formatted Text(lotus格式的文本) (PRN) | ⭕️ | ⭕️ |
| UTF-16 Unicode Text (TXT) | ⭕️ | ⭕️ |
| 其他工作簿/工作表格式 | :—–: | :—–: |
| OpenDocument Spreadsheet(開放文檔格式的電子表格) (ODS) | ⭕️ | ⭕️ |
| Flat XML ODF Spreadsheet (FODS) | ⭕️ | ⭕️ |
| Uniform Office Format Spreadsheet (標文通 UOS1/UOS2) | ⭕️ | |
| dBASE II/III/IV / Visual FoxPro (DBF) | ⭕️ | ⭕️ |
| Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123) | ⭕️ | |
| Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW) | ⭕️ | |
| 其他常用的電子表格輸出格式 | :—–: | :—–: |
| HTML Tables | ⭕️ | ⭕️ |
| Rich Text Format tables(富文本格式表) (RTF) | ⭕️ | |
| Ethercalc Record Format(Ethercalc記錄格式) (ETH) | ⭕️ | ⭕️ |
不會寫入給定文件格式不支持的功能。具有范圍限制的格式將會被靜默截斷:
| Format | Last Cell | Max Cols | Max Rows |
|---|---|---|---|
| Excel 2007+ XML Formats (XLSX/XLSM) | XFD1048576 | 16384 | 1048576 |
| Excel 2007+ Binary Format (XLSB BIFF12) | XFD1048576 | 16384 | 1048576 |
| Excel 97-2004 (XLS BIFF8) | IV65536 | 256 | 65536 |
| Excel 5.0/95 (XLS BIFF5) | IV16384 | 256 | 16384 |
| Excel 2.0/2.1 (XLS BIFF2) | IV16384 | 256 | 16384 |
Excel 2003 電子表格的范圍限制被Excel的版本控制,并且不會寫入函數強制執行。
Excel 2007+ XML (XLSX/XLSM)
(點擊顯示)
XlSX和XLSM文件是ZIP容器包含的與開源打包約定(Open Packaging Conventions, OPC)一致的一系列文件。大多數XLSM格式與XLSX相同,被用作文件包含宏命令。
這個格式在ECMA-376以及隨后的ISO/IEC 29500都進行了標準化。Excel沒有加遵循這個規范,并且還有其他文件討論Excel如何偏離規范。
Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)
(點擊顯示)
BIFF 2/3 XLS是二進制記錄的單表流。Excel 4介紹了工作簿的原理,除了有單表的XLS格式。結構與Lotus 1-2-3文件格式非常相似。BIFF5/8/12用了多種方式擴展格式,不過很大程度上保持了相同的記錄格式。
對于這些格式沒有官方的規范。Excel 95在這些格式里面可以寫入文件,因此記錄的長度以及字段都是由所有支持的格式以及比較文件決定。Excel 2016可以生成BIFF5文件,從XLSX或BIFF2開始啟用全套文件測試。
Excel 97-2004 Binary (BIFF8)
(點擊顯示)
BIFF8僅僅使用混合的文件二進制容器格式,將一些內容放在文件的流內。在它的核心,它將會使用來自BIFF的老版本的二進制記錄格式的擴展版本。
MS-XLS規范覆蓋了文件格式的基礎,并且其他的規范擴展了屬性(如特性)的規范化。
Excel 2003-2004 (SpreadsheetML)
(點擊顯示)
在XLSX之前,SpreadsheetML文件是簡單的XML文件。沒有官方的并且全面的的規范,雖然MS對于這種格式有發布的文檔。因此Excel 2016 生成了電子表格文件,映射功能非常簡單。
Excel 2007+ Binary (XLSB, BIFF12)
(點擊顯示)
XLSB格式與XLSX并行引入,將BIFF架構與內容分離和XLSX的ZIP容器相結合。XLSX子文件的大部分節點能用一個相應的子文件映射到XLSB記錄中去。
MS-XLSB規范包含了文件格式的基礎,并且其他的規范擴展了屬性(如特性)的序列化。
定界分隔符的值 (CSV/TXT)
(點擊顯示)
Excel CSV在許多重要的方法上背離了RFC4180。生成的CSV文件通常應該運行在Excel內,但是他們不能運行RFC4180兼容的讀取器中。解析器通常理解Excel CSV。如果值不可用,寫入器會為公式主動生成單元格。
Excel TXT 使用tab作為分隔符,編碼頁1200。
注意:
- 像在Excel中,以
0x49 0x44 ("ID")開始的文件會被當做是符號鏈接(Symbolic Link)文件。不像Excel,如果文件沒有一個有效的SYLK標題,他將會被主動解釋為SYLK文件。為了廣泛的兼容性,所有值為ID的單元格會自動用雙引號包裹。
其他工作簿格式
(點擊顯示) 對其他格式的支持通常遠遠超出XLS / XLSB / XLSX支持,這在很大程度上是由于缺乏公開可用的文檔。文件通常是在各自的應用內產生,并且會與他們的導出文件相比較以確定結構。主要的關注點是數據提出。
Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)
(點擊顯示)
Lotus格式由與BIFF結構相似的二進制記錄組成。Lotus幾十年前發布了一份包含原始WK1格式的規范。通過生成文件和與Excel支持進行比較來推斷其他功能。
Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)
(點擊顯示)
Quattro Pro格式使用與BIFF和Lotus一樣的二進制記錄。一些較新的格式(命名為WB3 和 QPW)使用像BIFF8 XLS一樣的CFB附件。
OpenDocument Spreadsheet(開放文檔格式的電子表格) (ODS/FODS)
(點擊顯示)
ODS是一種類似于XLSX的XML-in-ZIP格式,而FODS是一種類似于SpreadsheetML的XML格式。兩種格式都在OASIS標準中進行了詳細的說明,不過像LO/OO工具被添加到了未公開的擴展中。解析器和編寫器并沒有實現全部的標準,反而重點實現了提取和存儲行數據中重要的部分。
Uniform Office Spreadsheet(統一辦公電子表格) (UOS1/2)
(點擊顯示)
UOS是一種非常相似的格式,并且它有2個變種,分別對應ODS和FODS。大多數情況下,格式之間的區別是標簽和屬性的名稱。
Other Single-Worksheet Formats(其他單一工作表格式)
大多數較老的瀏覽器僅支持一種工作表:
dBASE and Visual FoxPro (DBF)
(點擊顯示)
DBF實際上是一種類型化的表格格式:每一列只能保存一種數據類型,并且每條記錄忽略類型信息。解析器生成標題行并且在工作表的第二行開始插入記錄。編寫器讓文件和Visual FoxPro兼容。
多文件的擴展,比如內部示例和表格,目前不支持,會被在web瀏覽器中讀取任意文件的普通能力所限制。讀取器理解DBF level 7的擴展,比如DATETIME。
Symbolic Link(符號鏈接) (SYLK)
(點擊顯示) 沒有真正的文檔。通過各種版本的Excel中保存文件來收集所有知識,以推斷出字段的含義。注意:
- 簡單的公式被存儲在RC表單中。
- 列寬會被四舍五入成完整的字符。
Lotus Formatted Text (PRN)
(點擊顯示) 沒有真正的文檔。事實上Excel把PRN視為一種只能輸出的文件格式。然而我們能夠猜測列寬并且反向還原原始布局。Excel 240個字符寬度的限制不會被強制執行。
Data Interchange Format(數據交換格式) (DIF)
(點擊顯示)
沒有統一標準的定義。 Visicalc DIF與Lotus DIF不同,并且兩者都與Excel DIF不一樣。在不明確的情況下,解析器/編寫器遵循Excel中的預期行為。特別地,Excel以不兼容的方式擴展DIF:
- 由于Excel自動將數字字符串轉換為數字,數字的字符串常量被轉換成公式:
"0.3" -> "=""0.3"" - DIF技術上期待數字的單元格保存原始的數字數據,不過Excel允許格式化數字(包括日期)。
- DIF技術上不支持公式,但是Excel將會轉換簡單公式。數組公式沒有保存。
HTML
(點擊顯示) Excel HTML工作表包含以樣式編碼的特殊元數據。例如`mso-number-format`是一個包含數字格式的本地化字符串。盡管元數據的輸出是有效的HTML,但是他不接受空的`&`符號。
編寫器通過t標簽添加類型元數據到TD元素中去。解析器檢查這些標簽,并且覆蓋默認的解釋。例如文本<td>12345</td>將會被解析成數字,不過<td t="s">12345</td>將會被解析成文本。
Rich Text Format(富文本格式) (RTF)
(點擊顯示)
當復制工作表內的單元格或者范圍時,Excel RTF工作表會被存儲在剪貼板內。支持的編碼是單詞RTF支持的一個子集。
Ethercalc Record Format (ETH)
(點擊顯示)
Ethercalc是一種開源的web電子表格,由記錄格式驅動,讓人聯想到包含在MIME多部分消息中的SYLK。
測試
Node
(點擊顯示) `make test`將會運行node基礎的測試。默認情況下,它以各種支持的格式對文件運行測試。要測試一種指定的文件類型,設置`FMTS`為你想要測試的類型。使用`make test_misc`可以獲得指定功能的測試。
$ make test_misc # run core tests
$ make test # run full tests
$ make test_xls # only use the XLS test files
$ make test_xlsx # only use the XLSX test files
$ make test_xlsb # only use the XLSB test files
$ make test_xml # only use the XML test files
$ make test_ods # only use the ODS test files
要想啟用所有的錯誤,請設置環境變量WTF=1:
$ make test # run full tests
$ WTF=1 make test # enable all error messages
flow and eslint checks are available:
$ make lint # eslint checks
$ make flow # make lint + Flow checking
$ make tslint # check TS definitions
瀏覽器
(點擊顯示) 核心瀏覽器內測試可在此repo中的`tests/index.html`中找到。啟動一個本地服務器并且導航到那個目錄去運行測試。`make ctestserv`將會在8080端口啟動一個服務。
make ctest將生成瀏覽器裝置。要添加更多的文件,編輯tests/fixtures.lst并且添加路徑。
要運行完整的瀏覽器內測試,從oss.sheetjs.com克隆這個repo,并且替換xlsx.js文件(然后打開一個瀏覽器窗口跳轉到stress.html)。
$ cp xlsx.js ../SheetJS.github.io
$ cd ../SheetJS.github.io
$ simplehttpserver # or "python -mSimpleHTTPServer" or "serve"
$ open -a Chromium.app http://localhost:8000/stress.html
測試環境
(點擊顯示)
- NodeJS
0.8,0.10,0.12,4.x,5.x,6.x,7.x,8.x - IE 6/7/8/9/10/11 (IE 6-9 require shims)
- Chrome 24+ (including Android 4.0+)
- Safari 6+ (iOS and Desktop)
- Edge 13+, FF 18+, and Opera 12+
測試使用mocha測試框架。Travis-CI 和 Sauce Labs 鏈接:
- https://travis-ci.org/SheetJS/js-xlsx 用于nodejs內的XLSX模塊
- https://semaphoreci.com/sheetjs/js-xlsx 用于nodejs內的XLSX模塊
- https://travis-ci.org/SheetJS/SheetJS.github.io 用于 XLS* 模塊
- https://saucelabs.com/u/sheetjs 用于使用Sauce Labs的 XLS* 模塊
Travis-CI測試組合也包括用于多種時區的測試。改變本地的時區,設置TZ環境可用:
$ env TZ="Asia/Kolkata" WTF=1 make test_misc
測試文件
測試文件被封裝在另一個倉庫。
運行make init將會刷新test_files子模塊并獲取子模塊的文件。注意這個可能需要svn, git, hg以及其它可能不可用的命令。如果make init失敗,請從倉庫下載測試文件快照的最新版本。
最新快照 (點擊顯示) 最新的測試文件快照:
(下載并解壓到test_files子目錄)
貢獻
由于開放規范承諾的不穩定性,確保代碼是潔凈室非常重要。貢獻記錄
文件組織 (點擊顯示) 在最高級別,最終腳本是`bits`文件夾中各個文件的串聯。運行`make`應該在所有平臺上重現最終輸出。同樣,README被分成了`docbits`文件夾中的位。
文件夾:
| folder | contents |
|---|---|
bits |
組成最終腳本的原生源文件 |
docbits |
組成README.md的原生markdown文件 |
bin |
服務器端bin腳本 (xlsx.njs) |
dist |
用于Web瀏覽器和非標準JS環境的dist文件 |
demos |
針對ExtendScript和Webpack等平臺的演示項目 |
tests |
瀏覽器測試 (運行 make ctest 進行構建) |
types |
typescript定義和測試 |
misc |
各種各樣的支持腳本 |
test_files |
測試文件 (從測試文件倉庫拉取) |
克隆倉庫之后,運行make help將會顯示一個命令列表。
OSX/Linux
(點擊顯示)
xlsx.js文件由來自于bits子目錄的文件構建。構建腳本(運行make)將會連接各個位來產生腳本。提交一個貢獻之前,確保運行將會準確地產生xlsx.js文件。測試的最簡單方式就是添加下面的腳本:
$ git add xlsx.js
$ make clean
$ make
$ git diff xlsx.js
運行make dist產生dist文件。每一個版本中的dist文件都會被更新,并且不應該在版本之間提交。
Windows
(點擊顯示)
包含make.cmd的腳本將會從bits目錄中構建xlsx.js。構建很簡單:
> make
準備開發環境:
> make init
windows中可用命令的完整列表顯示在make help中:
make init -- 安裝依賴和全局模塊
make lint -- 運行 eslint linter
make test -- 運行mocha測試組合
make misc -- 運行更小的測試組合
make book -- 重新構建README 和 summary
make help -- 顯示命令信息
與測試文件中解釋的一樣,在windows中發布ZIP文件必須要下載和提取。如果Bash在windows內可用,可能會運行 OSX/Linux工作流。下面額步驟準備環境:
# Install support programs for the build and test commands
sudo apt-get install make git subversion mercurial
# Install nodejs and NPM within the WSL
wget -qO- https://deb.nodesource.com/setup_8.x | sudo bash
sudo apt-get install nodejs
# Install dev dependencies
sudo npm install -g mocha voc blanket xlsjs
測試
(點擊顯示) `test_misc`(Linux/OSX用`make test_misc`/windows用`make misc`)目標運行定向的功能測試。執行功能測試需要5-10秒而無需對整個測試電池進行測試。新功能應附帶相關文件格式和功能的測試。
對于涉及讀取端的測試,一個合適的功能測試會包括讀取一個存在的文件并且檢查工作簿對象的結果。如果涉及參數,文件應該讀取不同的值以確保功能如預期所料工作。
對于涉及已經可以解析的新寫入功能的測試,恰當的功能測試包括用這個功能寫入工作簿,在之后打開并確認功能已經被保存。
對于涉及沒有現有讀取能力的新寫入功能的測試,請添加功能測試到kitchen sinktests/write.js。
證書
更多細節請查閱相關的證書。原始作者保留未由Apache 2.0許可證明確授予的所有權利。
引用
OSP覆蓋的規格(OSP-covered Specifications) (點擊顯示)
MS-CFB: 復合文件二進制文件格式(Compound File Binary File Format)MS-CTXLS: Excel自定義工具欄二進制文件格式(Excel Custom Toolbar Binary File Format)MS-EXSPXML3: Excel計算版本2 Web服務XML架構(Excel Calculation Version 2 Web Service XML Schema)MS-ODATA: 開源的數據協議(Open Data Protocol) (OData)MS-ODRAW: office繪圖二進制文件格式(Office Drawing Binary File Format)MS-ODRAWXML: Office開源XML結構的Office繪圖擴展(Office Drawing Extensions to Office Open XML Structure)MS-OE376: Office對ECMA-376標準支持的執行信息(Office Implementation Information for ECMA-376 Standards Support)MS-OFFCRYPTO: Office文檔密碼學結構(Office Document Cryptography Structure)MS-OI29500: Office對ISO/IEC 29500標準支持的執行信息(Office Implementation Information for ISO/IEC 29500 Standards Support)MS-OLEDS: 對象鏈接和嵌入數據結構(Object Linking and Embedding (OLE) Data Structures)MS-OLEPS: 對象鏈接和嵌入屬性設置數據結構(Object Linking and Embedding (OLE) Property Set Data Structures)MS-OODF3: Office對ODF 1.2標準支持的執行信息(Office Implementation Information for ODF 1.2 Standards Support)MS-OSHARED: Office常用數據類型和對象結構(Office Common Data Types and Objects Structures)MS-OVBA: Office VBA文件結構(Office VBA File Format Structure)MS-XLDM: 電子表格數據模型文件格式(Spreadsheet Data Model File Format)MS-XLS: Excel二進制文件格式(.xls)結構規范(Excel Binary File Format (.xls) Structure Specification)MS-XLSB: Excel (.xlsb)二進制文件格式(Excel (.xlsb) Binary File Format)MS-XLSX: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File FormatXLS: Microsoft Office Excel 97-2007 Binary File Format SpecificationRTF: 富文本(Rich Text Format)
- ISO/IEC 29500:2012(E) “信息技術 – 文檔描述和處理語言 – Office開源XML文件格式”
- Office應用版本 1.2(2011/9/29)開源文檔格式
- 工作表文件格式(來自于Lotus) 1984年12月
總結
以上是生活随笔為你收集整理的SheetJS中文文档-js导出Excel脚本库[通俗易懂]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Packer创建阿里云本地镜像
- 下一篇: C#.NET里面抽象类和接口有什么区别