@42technologies/xlsx 中文文档教程

发布于 3年前 浏览 28 项目主页 更新于 3年前

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 */
/* 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));
  }
});

完整示例:

请注意,旧版本的 IE 不支持 HTML5 文件 API,因此 base64 模式提供用于测试。 在 OSX 上,您可以获得 base64 编码:

$ <target_file.xlsx base64 | pbcopy

nodejs版本安装一个二进制xlsx可以读取XLSX/XLSM/XLSB 文件并以各种格式输出内容。 来源可在 xlsx.njs 在 bin 目录中。

XLSX.utils 中的一些辅助函数生成工作表的不同视图:

  • XLSX.utils.sheet_to_csv generates CSV
  • XLSX.utils.sheet_to_json generates an array of objects
  • XLSX.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")

完整示例:

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) 尝试写入wbfilename

Utilities

XLSX.utils 对象中提供实用程序:

导出:

  • sheet_to_json converts a workbook object to an array of JSON objects.
  • sheet_to_csv generates delimiter-separated-values output
  • sheet_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},其中 CR 是从 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

KeyDescription
vraw value **
wformatted text (if applicable)
tcell type: b Boolean, n Number, e error, s/str String
fcell formula (if applicable)
rrich text encoding (if applicable)
hHTML rendering of the rich text (if applicable)
ccomments associated with the cell **
znumber format string associated with the cell (if requested)
lcell hyperlink object (.Target holds link, .tooltip is tooltip)
sthe 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

导出的 readreadFile 函数接受一个选项参数:

Option NameDefaultDescription
cellFormulatrueSave formulae to the .f field
cellHTMLtrueParse rich text and save HTML to the .h field
cellNFfalseSave number format string to the .z field
cellStylesfalseSave style/theme info to the .s field
sheetStubsfalseCreate cell objects for stub cells
sheetRows0If >0, read the first sheetRows rows **
bookDepsfalseIf true, parse calculation chains
bookFilesfalseIf true, add raw files to book object **
bookPropsfalseIf true, only parse enough to get book metadata **
bookSheetsfalseIf true, only parse enough to get the sheet names
bookVBAfalseIf 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 and bookProps combine to give both sets of information
  • Deps will be an empty object if bookDeps is falsy
  • bookFiles adds a keys array (paths in the ZIP) and a files 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

导出的 writewriteFile 函数接受一个选项参数:

Option NameDefaultDescription
bookSSTfalseGenerate 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 Numbers
  • bookType = '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 链接:

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

构建状态

覆盖状态

githalytics.com alpha

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 */
/* 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:

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

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 CSV
  • XLSX.utils.sheet_to_json generates an array of objects
  • XLSX.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:

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 output
  • sheet_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

KeyDescription
vraw value **
wformatted text (if applicable)
tcell type: b Boolean, n Number, e error, s/str String
fcell formula (if applicable)
rrich text encoding (if applicable)
hHTML rendering of the rich text (if applicable)
ccomments associated with the cell **
znumber format string associated with the cell (if requested)
lcell hyperlink object (.Target holds link, .tooltip is tooltip)
sthe 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/KIaNKQ

    Functions 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 at ws['!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 the wpx field, character width in the wch field, and the maximum digit width in the MDW 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 NameDefaultDescription
cellFormulatrueSave formulae to the .f field
cellHTMLtrueParse rich text and save HTML to the .h field
cellNFfalseSave number format string to the .z field
cellStylesfalseSave style/theme info to the .s field
sheetStubsfalseCreate cell objects for stub cells
sheetRows0If >0, read the first sheetRows rows **
bookDepsfalseIf true, parse calculation chains
bookFilesfalseIf true, add raw files to book object **
bookPropsfalseIf true, only parse enough to get book metadata **
bookSheetsfalseIf true, only parse enough to get the sheet names
bookVBAfalseIf 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 and bookProps combine to give both sets of information
  • Deps will be an empty object if bookDeps is falsy
  • bookFiles adds a keys array (paths in the ZIP) and a files 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 NameDefaultDescription
bookSSTfalseGenerate 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 Numbers
  • bookType = '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:

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

Badges

Build Status

Coverage Status

githalytics.com alpha

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文