js-XLSX
xlsx
是由SheetJS
开发的一个处理excel文件的npm库
适用于前端开发者实现导入导出excel文件的经典需求
为了区别于xlsx文件,突出其应用语言,该库通常又被称为js-xlsx
以下内容翻译于
xlsx
官方README文档,可能存在一定翻译错误,欢迎指出部分章节,如测试,贡献,引用等不翻译
官方README文档地址https://www.npmjs.com/package/xlsx
SheetJS
SheetJS社区版提供了经受过考验的开源解决方案,可以从几乎任何复杂的电子表格中提取有用的数据,并生成新的电子表格,这些表格将与传统和现代软件一起使用
SheetJS Pro提供了数据处理之外的解决方案:轻松编辑复杂模板;通过造型展现你内心的毕加索;制作带有图像/图表/数据透视表的自定义表格;评估公式表达式和web应用程序的端口计算;自动化常见的电子表格任务等等
起步
下载
独立的浏览器脚本
完整且独立的浏览器脚本,保存在dist/xlsx.full.min.js中,可以直接用script标签添加到页面
<script lang="javascript" src="dist/xlsx.full.min.js"></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 | https://cdnjs.com/libraries/xlsx |
如下示例,通过unpkg使用最新版的xlsx
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
浏览器构建
完整的单文件版本为dist/xlsx.full.min.js dist/xlsx.core.min.js省略了代码页库(不支持XLS编码) 一个更纤细的版本保存在dist/xlsx.mini.min.js,与完整版本相比:
- 省略了代码页库(不支持XLS编码)
- 不支持XLSB/XLS/Lotus 1-2-3/SpreadsheetML 2003/Numbers
- 删除了node流工具
使用bower:
$ bower install js-xlsx
$ bower install js-xlsx
ECMAScript 模块
ECMAScript模块版本名为xlsx.mjs,可以使用type=module来直接添加到包含<script>标签的页面:
<script type="module">
import { read, writeFileXLSX } from "./xlsx.mjs";
/* 加载代码页支持库以扩展对旧格式的支持 */
import { set_cptable } from "./xlsx.mjs";
import * as cptable from './dist/cpexcel.full.mjs';
set_cptable(cptable);
</script>
<script type="module">
import { read, writeFileXLSX } from "./xlsx.mjs";
/* 加载代码页支持库以扩展对旧格式的支持 */
import { set_cptable } from "./xlsx.mjs";
import * as cptable from './dist/cpexcel.full.mjs';
set_cptable(cptable);
</script>
xlsx的npm包也提供了这些函数,可以用在Angular和其他框架中
import { read, writeFileXLSX } from "xlsx";
/* 加载代码页支持库以扩展对旧格式的支持 */
import { set_cptable } from "xlsx";
import * as cptable from 'xlsx/dist/cpexcel.full.mjs';
set_cptable(cptable);
import { read, writeFileXLSX } from "xlsx";
/* 加载代码页支持库以扩展对旧格式的支持 */
import { set_cptable } from "xlsx";
import * as cptable from 'xlsx/dist/cpexcel.full.mjs';
set_cptable(cptable);
Deno
xlsx.mjs能被Deno导入,可以使用unpkg
// @deno-types="https://unpkg.com/xlsx/types/index.d.ts"
import * as XLSX from 'https://unpkg.com/xlsx/xlsx.mjs';
/* load the codepage support library for extended support with older formats */
import * as cptable from 'https://unpkg.com/xlsx/dist/cpexcel.full.mjs';
XLSX.set_cptable(cptable);
// @deno-types="https://unpkg.com/xlsx/types/index.d.ts"
import * as XLSX from 'https://unpkg.com/xlsx/xlsx.mjs';
/* load the codepage support library for extended support with older formats */
import * as cptable from 'https://unpkg.com/xlsx/dist/cpexcel.full.mjs';
XLSX.set_cptable(cptable);
NodeJS
使用npm
$ npm install xlsx
$ npm install xlsx
默认情况下,支持require:
var XLSX = require("xlsx");
var XLSX = require("xlsx");
还可以用xlsx.mjs来使用import
import * as XLSX from 'xlsx/xlsx.mjs';
/* load 'fs' for readFile and writeFile support */
import * as fs from 'fs';
XLSX.set_fs(fs);
/* load 'stream' for stream support */
import { Readable } from 'stream';
XLSX.stream.set_readable(Readable);
/* load the codepage support library for extended support with older formats */
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
XLSX.set_cptable(cpexcel);
import * as XLSX from 'xlsx/xlsx.mjs';
/* load 'fs' for readFile and writeFile support */
import * as fs from 'fs';
XLSX.set_fs(fs);
/* load 'stream' for stream support */
import { Readable } from 'stream';
XLSX.stream.set_readable(Readable);
/* load the codepage support library for extended support with older formats */
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
XLSX.set_cptable(cpexcel);
Photoshop与InDesign
dist/xlsx.extendscript.js是一个用于Photoshop和InDesign的ExtendScript构建,包含在npm包中。它可以直接引用一个#include指令:
#include "xlsx.extendscript.js"
#include "xlsx.extendscript.js"
Internet Explorer和ECMAScript 3的兼容性
为了与JavaScript引擎广泛兼容,该库使用ECMAScript 3语言方言以及一些ES5功能(如Array#forEach)编写。较旧的浏览器需要垫片来提供缺失的功能
要使用垫片,请在加载xlsx.js的script标签之前添加垫片
<!-- 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>
<!-- 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>
该脚本还包括IE_LoadFile和IE_SaveFile,用于在Internet Explorer版本6-9中加载和保存文件。xlsx.extendscript.js打包垫片来适用于Photoshop和其他Adobe产品的格式
用法
大多数涉及电子表格和数据的场景可分为5个部分:
1.获取数据
:数据可以存储在任何地方:本地或远程文件、数据库、HTML表,甚至在web浏览器中以编程方式生成2.提取数据
:对于电子表格文件,这涉及到解析原始字节以读取单元格数据。对于一般的JS数据,这涉及重塑数据3.处理数据
:从生成汇总统计数据到清理数据记录,这一步是问题的核心4.打包数据
:这可能涉及制作新的电子表格或使用JSON序列化。为UI工具字符串化或编写XML或简单地扁平化数据5.发布数据
:电子表格文件可以上传到服务器或在本地写入。数据可以在HTML表格或数据网格中呈现给用户
一个常见情景,把存储在HTML表中的数据生成有效的电子表格导出。在下方示例中,页面上的一个HTML表将被使用,底部将添加一行日期,生成一个新xlsb文件并在本地下载。XLSX.writeFile负责打包数据并尝试本地下载:
// Acquire Data (reference to the HTML table)
var table_elt = document.getElementById("my-table-id");
// Extract Data (create a workbook object from the table)
var workbook = XLSX.utils.table_to_book(table_elt);
// Process Data (add a new row)
var ws = workbook.Sheets["Sheet1"];
XLSX.utils.sheet_add_aoa(ws, [["Created "+new Date().toISOString()]], {origin:-1});
// Package and Release Data (`writeFile` tries to write and save an XLSB file)
XLSX.writeFile(workbook, "Report.xlsb");
// Acquire Data (reference to the HTML table)
var table_elt = document.getElementById("my-table-id");
// Extract Data (create a workbook object from the table)
var workbook = XLSX.utils.table_to_book(table_elt);
// Process Data (add a new row)
var ws = workbook.Sheets["Sheet1"];
XLSX.utils.sheet_add_aoa(ws, [["Created "+new Date().toISOString()]], {origin:-1});
// Package and Release Data (`writeFile` tries to write and save an XLSB file)
XLSX.writeFile(workbook, "Report.xlsb");
该库尝试使用函数来简化步骤2和4,从电子表格文件(读/读文件)中提取有用的数据,并从数据(写/写文件)中生成新的电子表格文件。其他实用程序函数(如table_to_book
)与其他常见数据源(如HTML表格)配合使用
本文档和各种演示项目涵盖了步骤1和5的一些常见场景和方法
实用功能有助于完成第3步
获取和提取数据
章节描述了常见数据导入场景的解决方案打包和发布数据
章节描述了常见数据导出场景的解决方案Utility(实用)函数列表
章节详细介绍了将JSON数组和其他常见JS结构转换为工作表对象的实用函数
Sheetjs的理念(禅)
数据处理应该适合任何工作流
本库不强制推行单独的生命周期。它非常适合使用任何框架构建的网站和应用程序。简单的JS数据对象将很好地与Web开发者和未来的浏览器API配合
JavaScript是一种强大的数据处理语言
通用电子表格格式
是workbook
核心概念的简单对象表示。库中的各种函数提供了处理对象的低级工具
为了友好的JS处理,有一些utility(实用)
函数用于将worksheet
的部分转换为数组或从数组中转换。以下示例将功能强大的JS数组方法与网络请求库相结合,下载数据、选择所需信息并创建workbook
文件
示例:JSON生成workbook
目标是生成一个包含美国总统姓名和生日的xlsx文件
1.获取数据
原始数据
https://theunitedstates.io/congress-legislators/executive.json具有所需的数据。例如,John Adams:
John Adams{
"id": { /* (data omitted) */ },
"name": {
"first": "John", // <-- first name
"last": "Adams" // <-- last name
},
"bio": {
"birthday": "1735-10-19", // <-- birthday
"gender": "M"
},
"terms": [
{ "type": "viceprez", /* (other fields omitted) */ },
{ "type": "viceprez", /* (other fields omitted) */ },
{ "type": "prez", /* (other fields omitted) */ } // <-- look for "prez"
]
}
John Adams{
"id": { /* (data omitted) */ },
"name": {
"first": "John", // <-- first name
"last": "Adams" // <-- last name
},
"bio": {
"birthday": "1735-10-19", // <-- birthday
"gender": "M"
},
"terms": [
{ "type": "viceprez", /* (other fields omitted) */ },
{ "type": "viceprez", /* (other fields omitted) */ },
{ "type": "prez", /* (other fields omitted) */ } // <-- look for "prez"
]
}
筛选总统
原始数据包含Aaron Burr,一位从未当过总统的副总统!
需要通过数组方法filter
来创建一个新数组,一位总统至少任期一届,字段名为“prez”。为了测试是否至少有一个“prez”项,使用数组的some
方法。完整的过滤函数:
const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
整理数据
在本例中,姓名是名与姓row.name.first+" "+row.name.last
的组合,生日字段row.bio.birthday
。使用数组的map方法,对数据进行整理:
const rows = prez.map(row => ({
name: row.name.first + " " + row.name.last,
birthday: row.bio.birthday
}));
const rows = prez.map(row => ({
name: row.name.first + " " + row.name.last,
birthday: row.bio.birthday
}));
结果是一个没有嵌套的“简单”对象数组:
[
{ name: "George Washington", birthday: "1732-02-22" },
{ name: "John Adams", birthday: "1735-10-19" },
// ... one row per President
]
[
{ name: "George Washington", birthday: "1732-02-22" },
{ name: "John Adams", birthday: "1735-10-19" },
// ... one row per President
]
2.提取数据
使用处理过的数据,XLSX.utils.json_to_sheet
生成一个worksheet
const worksheet = XLSX.utils.json_to_sheet(rows);
const worksheet = XLSX.utils.json_to_sheet(rows);
XLSX.utils.book_new
创建一个新的workbook
且XLSX.utils.book_append_sheet
添加一个worksheet
到workbook
中。这个新的worksheet
会被命名为Dates
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
3.处理数据
固定标题行
默认情况下,json_to_sheet
会创建一个带有标题行的worksheet
。在本例中,标题行来自JS对象键:”name"和"birthday"
标题位于单元格A1和B1中。XLSX.utils.sheet_add_aoa
可以从单元格A1开始将文本值写入现有工作表:
XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });
XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });
固定列宽
有些名称的长度超过默认列宽。列宽通过设置!cols
worksheet
属性设置
将A列的宽度设置为大约10个字符:
worksheet["!cols"] = [ { wch: 10 } ];
worksheet["!cols"] = [ { wch: 10 } ];
使用数组的reduce方法来计算最大宽度
const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10);
worksheet["!cols"] = [ { wch: max_width } ];
const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10);
worksheet["!cols"] = [ { wch: max_width } ];
注意:如果起点是文件或HTML表,XLSX.utils.sheet_to_json
将生成一个JS对象数组
4.打包和发布数据
XLSX.writeFile
创建电子表格文件并尝试将其写入系统。在浏览器中,它将尝试提示用户下载文件。在NodeJS中,它将写入本地目录
XLSX.writeFile(workbook, "Presidents.xlsx");
XLSX.writeFile(workbook, "Presidents.xlsx");
完整示例
PS:以下代码经过测试,是可以正常使用于国内网络的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
// 导入xlsx
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
// 导入axios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
//取消注释下一行以便在NodeJS中使用:
//const XLSX=require(“XLSX”)、axios=require(“axios”);
;(async () => {
/* fetch JSON data and parse */
const url = "https://theunitedstates.io/congress-legislators/executive.json"
const raw_data = (await axios(url, { responseType: "json" })).data
/* filter for the Presidents */
const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"))
/* flatten objects */
const rows = prez.map(row => ({
name: row.name.first + " " + row.name.last,
birthday: row.bio.birthday
}))
/* generate worksheet and workbook */
const worksheet = XLSX.utils.json_to_sheet(rows)
const workbook = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(workbook, worksheet, "Dates")
/* fix headers */
XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" })
/* calculate column width */
const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10)
worksheet["!cols"] = [{ wch: max_width }]
/* create an XLSX file and try to save to Presidents.xlsx */
XLSX.writeFile(workbook, "Presidents.xlsx")
})()
</script>
</head>
<body>
<style></style>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
// 导入xlsx
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
// 导入axios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
//取消注释下一行以便在NodeJS中使用:
//const XLSX=require(“XLSX”)、axios=require(“axios”);
;(async () => {
/* fetch JSON data and parse */
const url = "https://theunitedstates.io/congress-legislators/executive.json"
const raw_data = (await axios(url, { responseType: "json" })).data
/* filter for the Presidents */
const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"))
/* flatten objects */
const rows = prez.map(row => ({
name: row.name.first + " " + row.name.last,
birthday: row.bio.birthday
}))
/* generate worksheet and workbook */
const worksheet = XLSX.utils.json_to_sheet(rows)
const workbook = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(workbook, worksheet, "Dates")
/* fix headers */
XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" })
/* calculate column width */
const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10)
worksheet["!cols"] = [{ wch: max_width }]
/* create an XLSX file and try to save to Presidents.xlsx */
XLSX.writeFile(workbook, "Presidents.xlsx")
})()
</script>
</head>
<body>
<style></style>
</body>
</html>
文件格式实现细节
解析器涵盖了各种常见的电子表格文件格式,以确保“HTML另存为XLS”文件能与实际的XLS或XLSX文件一样工作
为了与数据生态系统广泛兼容,writer支持多种常见的输出格式
尽可能使数据处理代码不必担心涉及特定文件格式
JS生态系统演示
demos
directory包括以下项目的示例:
框架和API
angularjs
angular and ionic
knockout
meteor
react and react-native
vue 2.x and weex
XMLHttpRequest and fetch
nodejs server
databases and key/value stores
typed arrays and math
打包工具
平台和集成
deno
electron application
nw.js application
Chrome / Chromium extensions
Download a Google Sheet locally
Adobe ExtendScript
Headless Browsers
canvas-datagrid
x-spreadsheet
react-data-grid
vue3-table-light
Swift JSC and other engines
"serverless" functions
internet explorer
其他示例在showcase
https://sheetjs.com/demos/modify.html显示了读取、修改和写入文件的完整示例
https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs是用于node中命令行工具,用于读取电子表格文件并以各种格式导出内容
获取和提取数据
解析workbook
API
从电子表格字节中提取数据
var workbook = XLSX.read(data, opts);
var workbook = XLSX.read(data, opts);
**read
**方法可以从存储在JS字符串、二进制字符串、NodeJS缓冲区或类型化数组(Uint8Array或ArrayBuffer)中的电子表格字节中提取数据
从本地文件读取电子表格字节并提取数据
var workbook = XLSX.readFile(filename, opts);
var workbook = XLSX.readFile(filename, opts);
**readFile
**方法尝试通过提供的路径来读取电子表格文件。浏览器端通常不允许以这种方式读取文件(这被认为是一种安全风险),浏览器端尝试以这种方式读取文件会引发错误
第二个opts参数是可选的。之后的解析选项
表格涵盖了支持的属性和行为
处理JSON和JS数据
JSON和JS数据往往表示单个worksheet
, 本节将使用一些utility
函数来生成workbook
创建新workbook
var workbook = XLSX.utils.book_new();
var workbook = XLSX.utils.book_new();
book_new
utility
函数创建一个没有worksheet
的workbook
通常,在电子表格软件中至少需要一个workbook
,它们会在用户界面中强制执行此要求,所以本库在写入时强制执行该要求,如果将空workbook
传递给写入函数,直接报错
API
使用JS二维数组创建worksheet
var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);
var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);
aoa_to_sheet
utility
函数按以行为主的顺序遍历“二维数组”,生成一个worksheet
对象。以下代码段生成了一个工作表,其中单元格A1设置为字符串A1,单元格B1设置为B1,以此类推:
var worksheet = XLSX.utils.aoa_to_sheet([
["A1", "B1", "C1"],
["A2", "B2", "C2"],
["A3", "B3", "C3"]
]);
var worksheet = XLSX.utils.aoa_to_sheet([
["A1", "B1", "C1"],
["A2", "B2", "C2"],
["A3", "B3", "C3"]
]);
二维数组输入
章节描述了这个函数和可选opts
参数的更多细节
使用JS对象数组创建worksheet
var worksheet = XLSX.utils.json_to_sheet(jsa, opts);
var worksheet = XLSX.utils.json_to_sheet(jsa, opts);
json_to_sheet
utility
函数按顺序遍历一组JS数组对象,生成一个worksheet
对象,默认情况下,它会生成一个标题行且把数组的每个对象作为一行,可选的opts
参数拥有控制列顺序和标题输出的设置
数组对象输入
章节更详细地描述了该函数和可选的opts
参数
打包和发布数据
写入Workbook
API
从数据生成电子表格字节(文件)
var data = XLSX.write(workbook, opts);
var data = XLSX.write(workbook, opts);
write
方法尝试将Workbook
中的数据打包到内存的文件中。默认情况下,会生成XLSX文件,但这可以通过opts
参数的bookType
属性进行控制。根据类型选项,数据可以存储为“二进制字符串”、JS字符串、Uint8Array或缓冲区
第二个opts参数是必需的。写入选项
章节涵盖支持的属性和行为
生成并尝试保存文件
XLSX.writeFile(workbook, filename, opts);
XLSX.writeFile(workbook, filename, opts);
writeFile方法打包数据并尝试保存新文件。导出文件格式由文件名的扩展名决定(SheetJS.xlsx表示xlsx导出、SheetJS.xlsb表示xlsb导出等)
writeFile方法使用特定平台的API来启动文件保存。在NodeJS中,fs.readFileSync可以创建一个文件。在web浏览器中,尝试使用HTML5 download属性进行下载,并为IE提供回落(callback
)
生成并尝试保存XLSX文件
XLSX.writeFileXLSX(workbook, filename, opts);
XLSX.writeFileXLSX(workbook, filename, opts);
writeFile方法嵌入了许多不同的导出函数。这对开发人员的体验很好,但不利于目前的开发工具进行tree shaking。当只需要XLSX导出时,此方法避免引用其他导出函数
第二个opts参数是可选的。写入选项
章节涵盖支持的属性和行为
流式写入
它们采用与普通写入函数相同的参数,但返回一个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
的流式版本
生成JSON和JS数据
JSON和JS数据往往表示单个worksheet
。本节中的utility(实用)
函数适用于单个工作表
通用电子表格格式
章节更详细地描述了对象结构。workbook.SheetNames
是包含worksheet
名称的有序列表。workbook.Sheets
是一个对象,其键是工作表名,其值是工作表对象
第一个worksheet
存储在workbook.Sheets[workbook.SheetNames[0]]
API
从一个worksheet
创建一个JS对象数组
var jsa = XLSX.utils.sheet_to_json(worksheet, opts);
var jsa = XLSX.utils.sheet_to_json(worksheet, opts);
从一个worksheet
创建一个JS二维数组
var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
sheet_to_json
utility(实用)
函数按以行为主的顺序遍历worksheet
,生成一个对象数组。第二个opts
参数控制许多导出决策,包括值的类型(JS值或格式化文本)。JSON
章节更详细地描述了该参数
默认情况下,sheet_to_json
扫描第一行并将这些值用作标题。使用header:1
选项,该函数将导出一组二维数组值
接口
XLSX
是浏览器和Node中的公开变量
XLSX.version
是库的版本(由生成脚本添加)
XLSX.SSF
是格式库的嵌入式版本
解析函数
XLSX.read(data, read_opts)
尝试解析数据
XLSX.readFile(filename, read_opts)
尝试读取文件名并进行解析
编译选项在编译选项
章节进行了描述
写入函数
XLSX.write(wb, write_opts)
尝试编写workbook
wb
XLSX.writeFile(wb, filename, write_opts)
尝试将wb
写入文件名。在基于浏览器的环境中,它将尝试强制客户端下载
XLSX.writeFileAsync(wb, filename, o, cb)
尝试将wb
写入文件名。如果省略了o,编写器将使用第三个参数作为回调
XLSX.stream
包含一组流式写入函数
写入选项在写入选项
章节进行了描述
Utilities(实用函数)
Utilities(实用函数)
可从XLSX.utils
对象中获取,实用程序功能
章节进行了描述:
创建:
book_new
创建一个空工作簿book_append_sheet
将工作表添加到工作簿
导入:
aoa_to_sheet
将JS二维数组转换为工作表json_to_sheet
将JS对象数组转换为工作表table_to_sheet
将DOM表格元素转换为工作表sheet_add_aoa
将JS二维数组添加到现有工作表中sheet_add_json
将JS对象数组添加到现有工作表中
导出:
sheet_to_json
将工作表对象转换为JSON对象数组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
转换单元格范围
通用电子表格格式
SheetJS符合通用电子表格格式(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}
表示。utility(实用)
函数执行单元格范围的按照以行为主的顺序遍历:
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);
}
}
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);
}
}
cell
对象
cell
对象是简单的JS对象,其键和值遵循约定:
Key | 描述 |
---|---|
v | 原始值(有关更多信息,请参见数据类型部分) |
w | 格式化文本(如适用) |
t | 类型:b布尔值、e错误、n编号、d日期、s文本、z存根 |
f | 编码为A1样式字符串的单元格公式(如果适用) |
F | 如果公式为数组公式,则封闭数组的范围(如果适用) |
D | 如果为true,则数组公式是动态的(如果适用) |
r | 富文本编码(如果适用) |
h | 富文本的HTML呈现(如果适用) |
c | 与单元格关联的注释 |
z | 与单元格关联的数字格式字符串(如果请求) |
l | 单元格超链接对象(.Target 控制链接, .Tooltip 提示文本) |
s | 单元的样式/主题(如果适用) |
sheet
对象
每个不以!
开头的键映射到单元格(使用A-1
表示法)
sheet[address]
返回指定地址的单元格对象
Special sheet keys (accessible as sheet[key]
, each starting with !
):
sheet['!ref']
: A-1 based range representing the sheet 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 sheet by hand, cells outside of the range are not includedFunctions that handle sheets 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 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']
sheet['!margins']
: 表示页边距的对象。默认值遵循Excel的"normal"预设。Excel也有"wide"和"narrow"预设,但它们会被存储为原始数值。主要属性如下:
key | 描述 | "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}
/* 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}
Worksheet
对象
除了基础的sheet
的keys
,worksheet
还增加了:
ws['!cols']
: 列属性对象的数组。列宽实际上是以标准化的方式存储在文件中的,以“最大数字宽度”(渲染数字0-9的最大宽度,以像素为单位)来衡量。解析后,列对象在wpx字段中存储像素宽度,在wch字段中存储字符宽度,在MDW字段中存储最大数字宽度ws['!rows']
: 行属性对象的数组,如文档后面所述。每个行对象都对包括行高和可见性在内的属性进行编码ws['!merges']
: 与工作表中的合并单元格相对应的范围对象数组。纯文本格式不支持合并单元格。CSV导出将写入合并范围内的所有单元格(如果存在),因此请确保仅设置该范围内的第一个单元格(左上角)ws['!outline']
: 配置轮廓的行为方式。选项默认为Excel 2019中的默认设置:
key | Excel feature | default |
---|---|---|
above | Uncheck "Summary rows below detail" | false |
left | Uncheck "Summary rows to the right of detail" | false |
ws['!protect']
: 写入页保护属性的对象。密码键指定支持密码保护工作表(XLSX/XLSB/XLS)的格式的密码。作者使用了XOR模糊处理方法。以下键控制工作表保护——设置为false可在工作表锁定时启用功能,或设置为true可禁用功能:ws['!autofilter']
: 模式下的自动筛选对象:
type AutoFilter = {
ref:string; // A-1 based range representing the AutoFilter table range
}
type AutoFilter = {
ref:string; // A-1 based range representing the AutoFilter table range
}
解析选项
The exported read
and readFile
functions accept an options argument:
Option Name | Default | Description |
---|---|---|
type | Input data encoding (see Input Type below) | |
raw | false | If true, plain text parsing will not parse values ** |
codepage | If specified, use code page when appropriate ** | |
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 |
cellText | true | Generated formatted text to the .w field |
cellDates | false | Store dates as type d (default is n ) |
dateNF | If specified, use the string for date code 14 ** | |
sheetStubs | false | Create cell objects of type z 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, copy VBA blob to vbaraw field ** |
password | "" | If defined and file is encrypted, use password ** |
WTF | false | If true, throw errors on unexpected file features ** |
sheets | If specified, only parse specified sheets ** | |
PRN | false | If true, allow parsing of PRN files ** |
xlfn | false | If true, preserve _xlfn. prefixes in formulae ** |
FS | DSV Field Separator override |
写入选项
导出的write和writeFile函数接受选项参数:
选项名 | 默认值 | 描述 |
---|---|---|
type | 输出数据编码(参见下面的输出类型 ) | |
cellDates | false | 将日期存储为d (默认值为n ) |
bookSST | false | 生成共享字符串表 |
bookType | "xlsx" | 工作簿类型(有关支持的格式,请参见下表) |
sheet | "" | 单页格式的工作表名称 |
compression | false | 对基于ZIP的格式使用ZIP压缩 |
Props | 写入时重写工作簿属性 | |
themeXLSX | 在编写XLSX/XLSB/XLSM时重写主题XML | |
ignoreEC | true | 抑制“数字为文本”错误 |
numbers | 用于数字输出的有效载荷 |
bookSST
速度较慢,内存更密集,但与旧版本的iOS数字兼容更好- 原始数据是唯一保证会被保存的东西。README文件中未描述的功能可能无法序列化
cellDates
仅适用于XLSX输出,不保证与第三方读卡器配合使用。Excel本身通常不使用类型d写入单元格,因此非Excel工具可能会忽略数据或存在日期的错误。Props
是一个镜像工作簿Props字段的对象。请参阅工作簿文件属性部分的表格- 如果指定,则来自
themeXLSX
的字符串将被保存为XLSX/XLSB/XLSM文件的主要主题(保存到ZIP中的xl/theme/theme1.xml) - 由于程序中存在缺陷,一些功能,如“文本到列”将使Excel在忽略错误条件的工作表上崩溃。默认情况下,编写器会将文件标记为忽略错误。将
ignoreEC
设置为false以抑制
bookType
支持的输出格式
bookType | 文件后缀名 | container | sheets | 描述 |
---|---|---|---|---|
xlsx | .xlsx | ZIP | multi | Excel 2007+ XML Format |
xlsm | .xlsm | ZIP | multi | Excel 2007+ Macro XML Format |
xlsb | .xlsb | ZIP | multi | Excel 2007+ Binary Format |
biff8 | .xls | CFB | multi | Excel 97-2004 Workbook Format |
biff5 | .xls | CFB | multi | Excel 5.0/95 Workbook Format |
biff4 | .xls | none | single | Excel 4.0 Worksheet Format |
biff3 | .xls | none | single | Excel 3.0 Worksheet Format |
biff2 | .xls | none | single | Excel 2.0 Worksheet Format |
xlml | .xls | none | multi | Excel 2003-2004 (SpreadsheetML) |
numbers | .numbers | ZIP | single | Numbers 3.0+ Spreadsheet |
ods | .ods | ZIP | multi | OpenDocument Spreadsheet |
fods | .fods | none | multi | Flat OpenDocument Spreadsheet |
wk3 | .wk3 | none | multi | Lotus Workbook (WK3) |
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) |
wk1 | .wk1 | none | single | Lotus Worksheet (WK1) |
rtf | .rtf | none | single | Rich Text Format (RTF) |
prn | .prn | none | single | Lotus Formatted Text |
eth | .eth | none | single | Ethercalc Record Format (ETH) |
compression
仅适用于带有ZIP容器的格式- 仅支持单个工作表的格式需要指定工作表的
sheet
选项。如果字符串为空,则使用第一个工作表 - 如果未指定
bookType
,writeFile
将根据文件扩展名自动猜测输出文件格式。它将在上述表格中选择与扩展名匹配的第一种格式
Utility(实用)函数列表
sheet_to_*
系列函数接受一个worksheet
和可选选项对象
*_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 |
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数据,返回一个基于传入数据的worksheet
,数字,布尔值和字符串会存储为相应的样式,日期会被存储为日期或数字, Array holes
和显式的undefined
值将被跳过,null
值也许会消失,其他值会被存储为字符串,这个函数接受选项参数:
选项名 | 默认值 | 描述 |
---|---|---|
dateNF | FMT 14 | 在字符串输出中使用指定的日期格式 |
cellDates | false | 将日期存储为类型d(默认值为n) |
sheetStubs | false | 为空值创建z类型的单元格对象 |
nullError | false | 如果为真,为null值输出#NULL!错误单元格 |
要生成示例工作表,请执行以下代码:
var ws = XLSX.utils.aoa_to_sheet([
"SheetJS".split(""),
[1,2,3,4,5,6,7],
[2,3,4,5,6,7,8]
]);
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数据,更新一个已存在的worksheet
对象,它和XLSX.utils.aoa_to_sheet
遵循同样的过程,并且接受选项参数:
选项名 | 默认值 | 描述 |
---|---|---|
dateNF | FMT 14 | 在字符串输出中使用指定的日期格式 |
cellDates | false | 将日期存储为类型d(默认值为n) |
sheetStubs | false | 为空值创建z类型的单元格对象 |
nullError | false | 如果为真,为空值输出#NULL!错误单元格 |
origin | 使用指定的单元格作为起点(见下文) |
origin
可以是下面几种
origin | 描述 |
---|---|
(cell object) | 使用指定的单元格(单元格对象) |
(string) | 使用指定的单元格(A1样式单元格) |
(number >= 0) | 从指定行的第一列开始(0-索引) |
-1 | 从第一列开始追加到工作表底部 |
(default) | 从A1单元开始 |
思考这个worksheet
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 |
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});
/* 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
接收一个数组对象,自动返回一个worksheet
,自动基于对象的所有key
生成标题行,默认列顺序由Object.keys
所产生数组的key的顺序来决定。该函数接受一个选项参数:
选项名 | 默认值 | 描述 |
---|---|---|
header | 使用指定的字段顺序**(默认Object.keys ) ** | |
dateNF | FMT 14 | 在字符串输出中使用指定的日期格式 |
cellDates | false | 将日期存储为类型d(默认值为n) |
skipHeader | false | 如果为true,则不在输出中包含标题行 |
nullError | false | 如果为真,为null值输出#NULL!错误单元格 |
- 将写入每行的所有字段。如果header是一个数组,但它不包含特定字段,则该键将附加到数组中
- 默认情况下,将跳过Null值。如果
nullError
为true,则对应的#NULL!错误单元格将被写入worksheet
XLSX.utils.sheet_add_json
获取对象数组并更新现有worksheet
对象。它遵循与json_to_sheet
相同的处理,并接受一个选项参数
选项名 | 默认值 | 描述 |
---|---|---|
header | 使用指定的字段顺序**(默认Object.keys ) ** | |
dateNF | FMT 14 | 在字符串输出中使用指定的日期格式 |
cellDates | false | 将日期存储为类型d(默认值为n) |
skipHeader | false | 如果为true,则不在输出中包含标题行 |
nullError | false | 如果为真,为null值输出#NULL!错误单元格 |
origin | 使用指定的单元格作为起点(见下文) |
origin
有以下几种
origin | 描述 |
---|---|
(cell object) | 使用指定的单元格(单元格对象) |
(string) | 使用指定的单元格(A1样式单元格) |
(number >= 0) | 从指定行的第一列开始(0-索引) |
-1 | 从第一列开始追加到worksheet 底部 |
(default) | 从A1单元开始 |
JSON
XLSX.utils.sheet_to_json
生成不同类型的JS对象。该函数接受一个选项参数:
选项名 | 默认值 | 描述 |
---|---|---|
raw | true | 使用原始值(true)或格式化字符串(false) |
range | from WS | 覆盖范围(见下表) |
header | 控制输出格式(见下表) | |
dateNF | FMT 14 | 在字符串输出中使用指定的日期格式 |
defval | 使用指定值代替null或undefined | |
blankrows | ** | 在输出中包括空行** |
raw
仅影响具有格式代码(.z)字段或格式文本(.w)字段的单元格- 如果指定了
header
,则第一行被视为数据行;如果未指定标题,则第一行是标题行,不考虑数据 - 未指定
header
时,转换将通过附加_
和从1开始的计数,来自动消除header
的歧义。例如,如果三列的标题为foo
,则输出字段为foo
、foo_1
、foo_2
- 当
raw
为true时返回null
,但当为false时跳过null
- 如果未指定
defval
,则通常跳过null
和undefined
。如果指定,所有null
和undefined
点都将用defval
填充 - 当
header
为1时,默认为生成空行。blankrows
必须设置为false才能跳过空白行 - 当
header
不是1时,默认值是跳过空行。blankrows
必须为true才能生成空白行
range
可以是以下几种
range | 描述 |
---|---|
(number) | 使用的worksheet 范围,该值作为起始行 |
(string) | 使用指定的范围(A1样式有界范围字符串) |
(default) | 使用的worksheet 范围(ws['!ref']) |
header
可以是以下几种
header | 描述 |
---|---|
1 | 生成一个二维数组(“2D数组”) |
"A" | 行对象键是文字列标签 |
array of strings | 将指定的字符串用作行对象中的键 |
(default) | 将第一行作为键读取并消除歧义 |
- 如果
header
不是1,则row对象将包含不可枚举属性__rowNum__
,该属性表示与条目对应的工作表行 - 如果header是一个数组,则不会消除键的歧义。如果数组值不唯一,这可能会导致意外的结果!
文件格式
尽管库名为xlsx
,但它支持多种电子表格文件格式:
格式 | 读 | 写 |
---|---|---|
Excel Worksheet/Workbook 格式 | :-----: | :-----: |
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 (PRN) | ✔ | ✔ |
UTF-16 Unicode Text (TXT) | ✔ | ✔ |
其他Workbook/Worksheet格式 | :-----: | :-----: |
Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS) | ✔ | ✔ |
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 (WK1/WK3) | ✔ | ✔ |
Lotus 1-2-3 (WKS/WK2/WK4/123) | ✔ | |
Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW) | ✔ | |
Works 1.x-3.x DOS / 2.x-5.x Windows Spreadsheet (WKS) | ✔ | |
Works 6.x-9.x Spreadsheet (XLR) | ✔ | |
Other Common Spreadsheet Output Formats | :-----: | :-----: |
HTML Tables | ✔ | ✔ |
Rich Text Format tables (RTF) | ✔ | |
Ethercalc Record Format (ETH) | ✔ | ✔ |
给定一个不支持的文件格式则不会被写入。具有范围限制的格式将被自动截断:
格式 | 末尾单元格 | 最大列 | 最大行 |
---|---|---|---|
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 4.0 (XLS BIFF4) | IV16384 | 256 | 16384 |
Excel 3.0 (XLS BIFF3) | IV16384 | 256 | 16384 |
Excel 2.0/2.1 (XLS BIFF2) | IV16384 | 256 | 16384 |
Lotus 1-2-3 R2 - R5 (WK1/WK3/WK4) | IV8192 | 256 | 8192 |
Lotus 1-2-3 R1 (WKS) | IV2048 | 256 | 2048 |
Excel 2003 SpreadsheetML范围限制由Excel版本管理,编写者不强制执行
许可
有关详细信息,请参阅随附的许可证文件。原始作者保留Apache 2.0许可证未明确授予的所有权利