@42technologies/xlsx 中文文档教程
xlsx
Excel 2007+ (XLSX/XLSM/XLSB) 文件的解析器和编写器。 纯JS无尘室 来自 Office Open XML 规范、[MS-XLSB] 和相关文档的实现。
Installation
在 nodejs 中:
npm install xlsx
在浏览器中:
<!-- This is the only file you need (includes xlsx.js and jszip) -->
<script lang="javascript" src="dist/xlsx.core.min.js"></script>
在 bower:
bower install js-xlsx
CDNjs 自动拉取最新版本并使所有版本可用 http://cdnjs.com/libraries/xlsx
本自述文件的旧版本推荐了一种更明确的方法:
<!-- JSZip must be included before xlsx.js -->
<script lang="javascript" src="/path/to/jszip.js"></script>
<script lang="javascript" src="/path/to/xlsx.js"></script>
Optional Modules
nodejs 版本自动需要模块附加功能。 一些 这些模块的尺寸相当大,只有在特殊情况下才需要 情况下,所以他们不附带核心。 对于浏览器的使用,他们必须 直接包含:
<!-- international support from https://github.com/sheetjs/js-codepage -->
<script src="dist/cpexcel.js"></script>
每个依赖项的适当版本包含在 dist/ 目录中。
完整的单文件版本在 dist/xlsx.full.min.js
生成
ECMAScript 5 compatibility
因为 xlsx.js 使用 ES5 函数,如 Array#forEach
,旧的浏览器需要 Polyfills。 这个 repo 和 gh-pages 分支包括 垫片
要使用垫片,请在加载 xlsx 的脚本标记之前添加垫片。 js:
<script type="text/javascript" src="/path/to/shim.js"></script>
Parsing Workbooks
对于解析,第一步是读取文件。
- nodejs:
if(typeof require !== 'undefined') XLSX = require('xlsx');
var workbook = XLSX.readFile('test.xlsx');
/* DO SOMETHING WITH workbook HERE */
- ajax (for a more complete example that works in older versions of IE, check the demo at http://oss.sheetjs.com/js-xlsx/ajax.html):
/* set up XMLHttpRequest */
var url = "test_files/formula_stress_test_ajax.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {type:"binary"});
/* DO SOMETHING WITH workbook HERE */
}
oReq.send();
- HTML5 drag-and-drop using readAsBinaryString:
/* set up drag-and-drop event */
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
var files = e.dataTransfer.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
/* if binary string, read with type 'binary' */
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
drop_dom_element.addEventListener('drop', handleDrop, false);
- HTML5 input file element using readAsBinaryString:
function handleFile(e) {
var files = e.target.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
input_dom_element.addEventListener('change', handleFile, false);
此示例遍历每个工作表的每个单元格并转储值:
var sheet_name_list = workbook.SheetNames;
sheet_name_list.forEach(function(y) {
var worksheet = workbook.Sheets[y];
for (z in worksheet) {
if(z[0] === '!') continue;
console.log(y + "!" + z + "=" + JSON.stringify(worksheet[z].v));
}
});
完整示例:
- http://oss.sheetjs.com/js-xlsx/ HTML5 File API / Base64 Text / Web Workers
请注意,旧版本的 IE 不支持 HTML5 文件 API,因此 base64 模式提供用于测试。 在 OSX 上,您可以获得 base64 编码:
$ <target_file.xlsx base64 | pbcopy
http://oss.sheetjs.com/js-xlsx/ajax。 html XMLHttpRequest
https://github.com/SheetJS/js-xlsx/ blob/master/bin/xlsx.njs nodejs
nodejs版本安装一个二进制xlsx
可以读取XLSX/XLSM/XLSB 文件并以各种格式输出内容。 来源可在 xlsx.njs
在 bin 目录中。
XLSX.utils
中的一些辅助函数生成工作表的不同视图:
XLSX.utils.sheet_to_csv
generates CSVXLSX.utils.sheet_to_json
generates an array of objectsXLSX.utils.sheet_to_formulae
generates a list of formulae
Writing Workbooks
假设 workbook
是一个工作簿对象,只需调用 write:
- nodejs write to file:
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsx');
- write to binary string (using FileSaver.js)
/* bookType can be 'xlsx' or 'xlsm' or 'xlsb' */
var wopts = { bookType:'xlsx', bookSST:false, type:'binary' };
var wbout = XLSX.write(workbook,wopts);
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;
}
saveAs(new Blob([s2ab(wbout)],{type:""}), "test.xlsx")
完整示例:
- http://sheetjs.com/demos/writexlsx.html generates a simple file
- http://git.io/WEK88Q writing an array of arrays in nodejs
- http://sheetjs.com/demos/table.html exporting an HTML table
Interface
XLSX
是浏览器中公开的变量,导出的 nodejs 变量
XLSX.version
是库的版本(由构建脚本添加)。
XLSX.SSF
是格式库的嵌入式版本。
Parsing functions
XLSX.read(data, read_opts)
尝试解析 data
。
XLSX.readFile(filename, read_opts)
尝试读取 filename
并解析。
Writing functions
XLSX.write(wb, write_opts)
尝试写入工作簿wb
XLSX.writeFile(wb, filename, write_opts)
尝试写入wb
到 filename
Utilities
XLSX.utils
对象中提供实用程序:
导出:
sheet_to_json
converts a workbook object to an array of JSON objects.sheet_to_csv
generates delimiter-separated-values outputsheet_to_formulae
generates a list of the formulae (with value fallbacks)
单元格和单元格地址操作:
format_cell
generates the text value for a cell (using number formats){en,de}code_{row,col}
convert between 0-indexed rows/cols and A1 forms.{en,de}code_cell
converts cell addresses{en,de}code_range
converts cell ranges
Workbook / Worksheet / Cell Object Description
js-xlsx 符合通用电子表格格式( CSF):
General Structures
单元格地址对象存储为 {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};
}
}
Cell Object
Key | Description |
---|---|
v | raw value ** |
w | formatted text (if applicable) |
t | cell type: b Boolean, n Number, e error, s/str String |
f | cell formula (if applicable) |
r | rich text encoding (if applicable) |
h | HTML rendering of the rich text (if applicable) |
c | comments associated with the cell ** |
z | number format string associated with the cell (if requested) |
l | cell hyperlink object (.Target holds link, .tooltip is tooltip) |
s | the style/theme of the cell (if applicable) |
- For dates,
.v
holds the raw date code from the sheet and.w
holds the text
内置导出实用程序(例如 CSV 导出器)将使用 w
文本,如果它 可用。 要更改值,请务必删除 cell.w
(或将其设置为 undefined
) 在尝试导出之前。 实用程序将重新生成 w
来自数字格式 (cell.z
) 的文本和原始值(如果可能)。
Worksheet Object
每个不以 !
开头的键映射到一个单元格(使用 A-1
表示法)
worksheet[address]
返回单元格对象指定地址。
特殊工作表键(可作为 worksheet[key]
访问,每个都以 !
开头):
ws['!ref']
:基于 A-1代表工作表范围的范围。 功能是 使用工作表应使用此参数来确定范围。 细胞 超出范围的分配不被处理。 特别是,当 手写工作表,一定要更新范围。 更长的时间 讨论,请参阅 http://git.io/KIaNKQ处理工作表的函数应该测试是否存在
!ref
领域。 如果!ref
被省略或不是有效范围,函数可以自由处理 表为空或尝试猜测范围。 标准实用程序 随此库一起将工作表视为空(例如,CSV 输出是一个 空字符串)。读取设置了
sheetRows
属性的工作表时,ref 参数 将使用限制范围。 原始范围设置在ws['!fullref']
ws['!cols']
:列属性对象数组。 列宽实际上是 以规范化的方式存储在文件中,根据“最大 数字宽度”(渲染数字 0-9 的最大宽度,以像素为单位)。当 解析后,列对象将像素宽度存储在wpx
字段中,字符wch
字段中的宽度,MDW
字段中的最大数字宽度。ws['!merges']
:合并单元格对应的范围对象数组 工作表。 明文实用程序不知道合并单元格。 CSV 导出 将写入合并范围内的所有单元格(如果存在),因此请确保只有 范围内的第一个单元格(左上角)已设置。
Workbook Object
workbook.SheetNames
是工作簿中工作表的有序列表
wb.Sheets[sheetname]
返回表示工作表的对象。
wb.Props
是一个存储标准属性的对象。 wb.Custprops
商店 自定义属性。
Parsing Options
导出的 read
和 readFile
函数接受一个选项参数:
Option Name | Default | Description |
---|---|---|
cellFormula | true | Save formulae to the .f field |
cellHTML | true | Parse rich text and save HTML to the .h field |
cellNF | false | Save number format string to the .z field |
cellStyles | false | Save style/theme info to the .s field |
sheetStubs | false | Create cell objects for stub cells |
sheetRows | 0 | If >0, read the first sheetRows rows ** |
bookDeps | false | If true, parse calculation chains |
bookFiles | false | If true, add raw files to book object ** |
bookProps | false | If true, only parse enough to get book metadata ** |
bookSheets | false | If true, only parse enough to get the sheet names |
bookVBA | false | If true, expose vbaProject.bin to vbaraw field ** |
- Even if
cellNF
is false, formatted text (.w) will be generated - In some cases, sheets may be parsed even if
bookSheets
is false. bookSheets
andbookProps
combine to give both sets of informationDeps
will be an empty object ifbookDeps
is falsybookFiles
adds akeys
array (paths in the ZIP) and afiles
hash (whose keys are paths and values are objects representing the files)sheetRows-1
rows will be generated when looking at the JSON object output (since the header row is counted as a row when parsing the data)bookVBA
merely exposes the raw vba object. It does not parse the data.
默认值在 bits/84_defaults.js 中枚举
Writing Options
导出的 write
和 writeFile
函数接受一个选项参数:
Option Name | Default | Description |
---|---|---|
bookSST | false | Generate Shared String Table ** |
bookType | 'xlsx' | Type of Workbook ("xlsx" or "xlsm" or "xlsb") |
bookSST
is slower and more memory intensive, but has better compatibility with older versions of iOS NumbersbookType = 'xlsb'
is stubbed and far from complete- The raw data is the only thing guaranteed to be saved. Formulae, formatting, and other niceties may not be serialized (pending CSF standardization)
Tested Environments
- NodeJS 0.8, 0.10 (latest release), 0.11 (unstable)
- IE 6/7/8/9/10/11 using Base64 mode (IE10/11 using HTML5 mode)
- FF 18 using Base64 or HTML5 mode
- Chrome 24 using Base64 or HTML5 mode
测试利用 mocha 测试框架。 Travis-CI 和 Sauce Labs 链接:
- https://travis-ci.org/SheetJS/js-xlsx for XLSX module in nodejs
- https://travis-ci.org/SheetJS/SheetJS.github.io for XLS* modules
- https://saucelabs.com/u/sheetjs for XLS* modules using Sauce Labs
Test Files
测试文件位于另一个仓库。
运行 make init
将刷新 test_files
子模块并获取文件。
Testing
make test
将运行基于 nodejs 的测试。 要运行浏览器内测试,请克隆 oss.sheetjs.com 存储库和 替换 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
对于更小的测试,运行 make test_misc
。
Contributing
由于开放规范承诺的不稳定性质,它非常 确保代码是洁净室很重要。 查阅 CONTRIBUTING.md
xlsx.js 文件是由 bits
子目录中的文件构建的。 这 构建脚本(运行 make
)将连接各个位以生成 脚本。 在提交贡献之前,确保运行 make 会产生 xlsx.js 文件。 最简单的测试方法是移动脚本:
$ mv xlsx.js xlsx.new.js
$ make
$ diff xlsx.js xlsx.new.js
XLS Support
XLS 在 js-xls 中可用。
License
有关详细信息,请参阅随附的许可证文件。 所有权利未明确 Apache 2.0 许可授予的所有内容均由原作者保留。
原作者认为此代码符合 Microsoft Open Specifications Promise,属于与以下相同的条款 OpenOffice(由 Apache License v2 管理)。 鉴于变幻莫测的 的承诺,原作者没有提出法律声明,实际上最终用户是 免受未来行动的影响。 强烈建议,对于商业 使用,您在继续之前咨询律师。
References
ISO/IEC 29500:2012(E)“信息技术——文档描述和处理语言——Office Open XML 文件格式”
OSP 涵盖的规范:
- [MS-XLSB]: Excel (.xlsb) Binary File Format
- [MS-XLSX]: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format
- [MS-OE376]: Office Implementation Information for ECMA-376 Standards Support
- [MS-XLDM]: Spreadsheet Data Model File Format
Badges
xlsx
Parser and writer for Excel 2007+ (XLSX/XLSM/XLSB) files. Pure-JS cleanroom implementation from the Office Open XML spec, [MS-XLSB], and related documents.
Installation
In nodejs:
npm install xlsx
In the browser:
<!-- This is the only file you need (includes xlsx.js and jszip) -->
<script lang="javascript" src="dist/xlsx.core.min.js"></script>
In bower:
bower install js-xlsx
CDNjs automatically pulls the latest version and makes all versions available at http://cdnjs.com/libraries/xlsx
Older versions of this README recommended a more explicit approach:
<!-- JSZip must be included before xlsx.js -->
<script lang="javascript" src="/path/to/jszip.js"></script>
<script lang="javascript" src="/path/to/xlsx.js"></script>
Optional Modules
The nodejs version automatically requires modules for additional features. Some of these modules are rather large in size and are only needed in special circumstances, so they do not ship with the core. For browser use, they must be included directly:
<!-- international support from https://github.com/sheetjs/js-codepage -->
<script src="dist/cpexcel.js"></script>
An appropriate version for each dependency is included in the dist/ directory.
The complete single-file version is generated at dist/xlsx.full.min.js
ECMAScript 5 compatibility
Since xlsx.js uses ES5 functions like Array#forEach
, older browsers require Polyfills. This repo and the gh-pages branch include a shim
To use the shim, add the shim before the script tag that loads xlsx.js:
<script type="text/javascript" src="/path/to/shim.js"></script>
Parsing Workbooks
For parsing, the first step is to read the file.
- nodejs:
if(typeof require !== 'undefined') XLSX = require('xlsx');
var workbook = XLSX.readFile('test.xlsx');
/* DO SOMETHING WITH workbook HERE */
- ajax (for a more complete example that works in older versions of IE, check the demo at http://oss.sheetjs.com/js-xlsx/ajax.html):
/* set up XMLHttpRequest */
var url = "test_files/formula_stress_test_ajax.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.onload = function(e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {type:"binary"});
/* DO SOMETHING WITH workbook HERE */
}
oReq.send();
- HTML5 drag-and-drop using readAsBinaryString:
/* set up drag-and-drop event */
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
var files = e.dataTransfer.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
/* if binary string, read with type 'binary' */
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
drop_dom_element.addEventListener('drop', handleDrop, false);
- HTML5 input file element using readAsBinaryString:
function handleFile(e) {
var files = e.target.files;
var i,f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
var name = f.name;
reader.onload = function(e) {
var data = e.target.result;
var workbook = XLSX.read(data, {type: 'binary'});
/* DO SOMETHING WITH workbook HERE */
};
reader.readAsBinaryString(f);
}
}
input_dom_element.addEventListener('change', handleFile, false);
This example walks through every cell of every sheet and dumps the values:
var sheet_name_list = workbook.SheetNames;
sheet_name_list.forEach(function(y) {
var worksheet = workbook.Sheets[y];
for (z in worksheet) {
if(z[0] === '!') continue;
console.log(y + "!" + z + "=" + JSON.stringify(worksheet[z].v));
}
});
Complete examples:
- http://oss.sheetjs.com/js-xlsx/ HTML5 File API / Base64 Text / Web Workers
Note that older versions of IE does not support HTML5 File API, so the base64 mode is provided for testing. On OSX you can get the base64 encoding with:
$ <target_file.xlsx base64 | pbcopy
http://oss.sheetjs.com/js-xlsx/ajax.html XMLHttpRequest
https://github.com/SheetJS/js-xlsx/blob/master/bin/xlsx.njs nodejs
The nodejs version installs a binary xlsx
which can read XLSX/XLSM/XLSB files and output the contents in various formats. The source is available at xlsx.njs
in the bin directory.
Some helper functions in XLSX.utils
generate different views of the sheets:
XLSX.utils.sheet_to_csv
generates CSVXLSX.utils.sheet_to_json
generates an array of objectsXLSX.utils.sheet_to_formulae
generates a list of formulae
Writing Workbooks
Assuming workbook
is a workbook object, just call write:
- nodejs write to file:
/* output format determined by filename */
XLSX.writeFile(workbook, 'out.xlsx');
- write to binary string (using FileSaver.js)
/* bookType can be 'xlsx' or 'xlsm' or 'xlsb' */
var wopts = { bookType:'xlsx', bookSST:false, type:'binary' };
var wbout = XLSX.write(workbook,wopts);
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;
}
saveAs(new Blob([s2ab(wbout)],{type:""}), "test.xlsx")
Complete examples:
- http://sheetjs.com/demos/writexlsx.html generates a simple file
- http://git.io/WEK88Q writing an array of arrays in nodejs
- http://sheetjs.com/demos/table.html exporting an HTML table
Interface
XLSX
is the exposed variable in the browser and the exported nodejs variable
XLSX.version
is the version of the library (added by the build script).
XLSX.SSF
is an embedded version of the format library.
Parsing functions
XLSX.read(data, read_opts)
attempts to parse data
.
XLSX.readFile(filename, read_opts)
attempts to read filename
and parse.
Writing functions
XLSX.write(wb, write_opts)
attempts to write the workbook wb
XLSX.writeFile(wb, filename, write_opts)
attempts to write wb
to filename
Utilities
Utilities are available in the XLSX.utils
object:
Exporting:
sheet_to_json
converts a workbook object to an array of JSON objects.sheet_to_csv
generates delimiter-separated-values outputsheet_to_formulae
generates a list of the formulae (with value fallbacks)
Cell and cell address manipulation:
format_cell
generates the text value for a cell (using number formats){en,de}code_{row,col}
convert between 0-indexed rows/cols and A1 forms.{en,de}code_cell
converts cell addresses{en,de}code_range
converts cell ranges
Workbook / Worksheet / Cell Object Description
js-xlsx conforms to the Common Spreadsheet Format (CSF):
General Structures
Cell address objects are stored as {c:C, r:R}
where C
and R
are 0-indexed column and row numbers, respectively. For example, the cell address B5
is represented by the object {c:1, r:4}
.
Cell range objects are stored as {s:S, e:E}
where S
is the first cell and E
is the last cell in the range. The ranges are inclusive. For example, the range A3:B7
is represented by the object {s:{c:0, r:2}, e:{c:1, r:6}}
. Utils use the following pattern to walk each of the cells in a range:
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};
}
}
Cell Object
Key | Description |
---|---|
v | raw value ** |
w | formatted text (if applicable) |
t | cell type: b Boolean, n Number, e error, s/str String |
f | cell formula (if applicable) |
r | rich text encoding (if applicable) |
h | HTML rendering of the rich text (if applicable) |
c | comments associated with the cell ** |
z | number format string associated with the cell (if requested) |
l | cell hyperlink object (.Target holds link, .tooltip is tooltip) |
s | the style/theme of the cell (if applicable) |
- For dates,
.v
holds the raw date code from the sheet and.w
holds the text
Built-in export utilities (such as the CSV exporter) will use the w
text if it is available. To change a value, be sure to delete cell.w
(or set it to undefined
) before attempting to export. The utilities will regenerate the w
text from the number format (cell.z
) and the raw value if possible.
Worksheet Object
Each key that does not start with !
maps to a cell (using A-1
notation)
worksheet[address]
returns the cell object for the specified address.
Special worksheet keys (accessible as worksheet[key]
, each starting with !
):
ws['!ref']
: A-1 based range representing the worksheet range. Functions that work with sheets should use this parameter to determine the range. Cells that are assigned outside of the range are not processed. In particular, when writing a worksheet by hand, be sure to update the range. For a longer discussion, see http://git.io/KIaNKQFunctions that handle worksheets should test for the presence of
!ref
field. If the!ref
is omitted or is not a valid range, functions are free to treat the sheet as empty or attempt to guess the range. The standard utilities that ship with this library treat sheets as empty (for example, the CSV output is an empty string).When reading a worksheet with the
sheetRows
property set, the ref parameter will use the restricted range. The original range is set atws['!fullref']
ws['!cols']
: array of column properties objects. Column widths are actually stored in files in a normalized manner, measured in terms of the "Maximum Digit Width" (the largest width of the rendered digits 0-9, in pixels). When parsed, the column objects store the pixel width in thewpx
field, character width in thewch
field, and the maximum digit width in theMDW
field.ws['!merges']
: array of range objects corresponding to the merged cells in the worksheet. Plaintext utilities are unaware of merge cells. CSV export will write all cells in the merge range if they exist, so be sure that only the first cell (upper-left) in the range is set.
Workbook Object
workbook.SheetNames
is an ordered list of the sheets in the workbook
wb.Sheets[sheetname]
returns an object representing the worksheet.
wb.Props
is an object storing the standard properties. wb.Custprops
stores custom properties.
Parsing Options
The exported read
and readFile
functions accept an options argument:
Option Name | Default | Description |
---|---|---|
cellFormula | true | Save formulae to the .f field |
cellHTML | true | Parse rich text and save HTML to the .h field |
cellNF | false | Save number format string to the .z field |
cellStyles | false | Save style/theme info to the .s field |
sheetStubs | false | Create cell objects for stub cells |
sheetRows | 0 | If >0, read the first sheetRows rows ** |
bookDeps | false | If true, parse calculation chains |
bookFiles | false | If true, add raw files to book object ** |
bookProps | false | If true, only parse enough to get book metadata ** |
bookSheets | false | If true, only parse enough to get the sheet names |
bookVBA | false | If true, expose vbaProject.bin to vbaraw field ** |
- Even if
cellNF
is false, formatted text (.w) will be generated - In some cases, sheets may be parsed even if
bookSheets
is false. bookSheets
andbookProps
combine to give both sets of informationDeps
will be an empty object ifbookDeps
is falsybookFiles
adds akeys
array (paths in the ZIP) and afiles
hash (whose keys are paths and values are objects representing the files)sheetRows-1
rows will be generated when looking at the JSON object output (since the header row is counted as a row when parsing the data)bookVBA
merely exposes the raw vba object. It does not parse the data.
The defaults are enumerated in bits/84_defaults.js
Writing Options
The exported write
and writeFile
functions accept an options argument:
Option Name | Default | Description |
---|---|---|
bookSST | false | Generate Shared String Table ** |
bookType | 'xlsx' | Type of Workbook ("xlsx" or "xlsm" or "xlsb") |
bookSST
is slower and more memory intensive, but has better compatibility with older versions of iOS NumbersbookType = 'xlsb'
is stubbed and far from complete- The raw data is the only thing guaranteed to be saved. Formulae, formatting, and other niceties may not be serialized (pending CSF standardization)
Tested Environments
- NodeJS 0.8, 0.10 (latest release), 0.11 (unstable)
- IE 6/7/8/9/10/11 using Base64 mode (IE10/11 using HTML5 mode)
- FF 18 using Base64 or HTML5 mode
- Chrome 24 using Base64 or HTML5 mode
Tests utilize the mocha testing framework. Travis-CI and Sauce Labs links:
- https://travis-ci.org/SheetJS/js-xlsx for XLSX module in nodejs
- https://travis-ci.org/SheetJS/SheetJS.github.io for XLS* modules
- https://saucelabs.com/u/sheetjs for XLS* modules using Sauce Labs
Test Files
Test files are housed in another repo.
Running make init
will refresh the test_files
submodule and get the files.
Testing
make test
will run the nodejs-based tests. To run the in-browser tests, clone the oss.sheetjs.com repo and replace the xlsx.js file (then fire up the browser and go to 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
For a much smaller test, run make test_misc
.
Contributing
Due to the precarious nature of the Open Specifications Promise, it is very important to ensure code is cleanroom. Consult CONTRIBUTING.md
The xlsx.js file is constructed from the files in the bits
subdirectory. The build script (run make
) will concatenate the individual bits to produce the script. Before submitting a contribution, ensure that running make will produce the xlsx.js file exactly. The simplest way to test is to move the script:
$ mv xlsx.js xlsx.new.js
$ make
$ diff xlsx.js xlsx.new.js
XLS Support
XLS is available in js-xls.
License
Please consult the attached LICENSE file for details. All rights not explicitly granted by the Apache 2.0 license are reserved by the Original Author.
It is the opinion of the Original Author that this code conforms to the terms of the Microsoft Open Specifications Promise, falling under the same terms as OpenOffice (which is governed by the Apache License v2). Given the vagaries of the promise, the Original Author makes no legal claim that in fact end users are protected from future actions. It is highly recommended that, for commercial uses, you consult a lawyer before proceeding.
References
ISO/IEC 29500:2012(E) "Information technology — Document description and processing languages — Office Open XML File Formats"
OSP-covered specifications:
- [MS-XLSB]: Excel (.xlsb) Binary File Format
- [MS-XLSX]: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format
- [MS-OE376]: Office Implementation Information for ECMA-376 Standards Support
- [MS-XLDM]: Spreadsheet Data Model File Format