js-xlsx实现纯前端导出excel表格
js-xlsx
没有需求就没有方法
最近接到一个新需求,需求乍一看很简单,就是在价格数据表格页面增加一个数据导出功能。然而在开发过程中,遇到了这儿样那样的问题。
后端同事说他那边只支持返回 json 数据,但是对于太大的数据量他那边只能限制导出的时候进行限量。这就很尴尬,前端如何将 json 数据成功导出为用户使用的 excel 文件?
项目使用的是 iVewUI 库。库中只提供了导出格式为 .csv 格式。这就很尴尬,需要自己实现。
废话不多说,来到今天的主题 js-xlsx 实现纯前端导出 excel 表格
js-xlsx
js-xlsx 是一个纯 JavaScript 实现的,能运行在所有 JavaScript 环境中,包括浏览器,NodeJs 等的 excel 库,能够读取和写入 excel 表格。
兼容性如下图: 
下面开始介绍 js-xlsx 的简单使用方式。
XLSX
使用之前,先安装它:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script
lang="javascript"
src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"
></script>
</head>
<body>
<script>
console.log(XLSX)
</script>
</body>
</html>通过打印 XLSX 看看它主要有哪些属性

SSF里定义了一些数据格式parse里解析相关read用来读取 xlsx 文件的 APIwrite用来把数据写入并生成 xlsx 文件的 APIversion指的是 js-xlsx 的版本号
读取 Excel 数据
为了解析数据,第一步就是读取文件,这里有几个不同的地方
通过文件 IO 获取数据
因为 Excel 数据表与 HTML Table 结构是相应的,所以也可以从 Table 里获取数据

通过 url (ajax) 获取数据
左边为输出内容,右边为表格数据

通过 HTML5 文件拖拽获取数据

HTML5 拖拽上传文件请点击查看
js-xlsx 的解析数据 API
XLSX.read(data, read_opts)
尝试解析 data
XLSX.readFile(filename, read_opts)
根据文件路径名,继续解析
workBook
workBook 就是读取 Excel 数据后的 json 对象,里面记录着 Excel 的数据信息

Custprops存储自定义属性Workbook存储工作簿属性SSF定义一些数据格式Directory是 Excel 文件的描述对象Props是 xlsx 文件的属性SheetNames里存储着每个 Sheet 的名字Sheets里面存储的是每个 Sheet 的数据
每个 Sheet 对象里都根据坐标存储 Excel 的二维数据,其中 !ref 代表这个表的范围

对应的是 Excel 表数据

其中 Strings 是一个数组,他按照从左到右,从上到下的顺序来把二维的数据降到一维
单元格对象
在下图中 A1 就是一个单元格对象,它代表着 Excel 二维表里的 A1 位置的单元格对象。

v
原始值
w
格式化文本
t
单元格类型:b 布尔值,n 数字,e 错误,s 字符串,d 日期
f
单元格的公式, 例如 f: 'A1 + A2'
F
如果公式是数组公式
r
富文本编码
h
富文本的 HTML 呈现
c
与单元格相关的注释
z
与单元格关联的数字格式字符串
l
单元格超链接对象(.Target 持有链接,.Tooltip 是工具提示)
s
单元格的样式/主题(可以设置字体颜色,加粗等)
导出数据到文件
对于写入,第一步是生成输出数据。对于生成输出数据也分为几种。
在 NodeJs 上
因为 Excel 是一个表格结构,因此可以轻易输出 HTML Table
浏览器保存
上传到服务器
js-xlsx 写入数据 API
XLSX.write(wb, write_opts)
写到 wb 里
XLSX.writeFIle(wb, filename, write_opts)
写入文件里
XLSX.writeFileAsync(filename,wb,o,cb)
异步方式,写入文件里
工具函数
XLSX.utils 是一个工具 API,一些函数用于把数据导出各种格式
sheet_to_* 函数接受一个工作表和一个可选的选项对象
*_to_sheet 函数接受一个数据对象和一个可选选项对象
XLSX.utils.sheet_to_csv
生成 CSV。
XLSX.utils.sheet_to_html
生成 HTML。
XLSX.utils.sheet_to_json
生成一个对象数组。
XLSX.utils.sheet_to_formulae
生成公式列表。
XLSX.utils.book_new()
创建一个默认的 Excel 文件描述对象。
XLSX.utils.book_append_sheet(wb, ws, “test”)
向 workbook 添加一个 ws,名称为 test。
XLSX.utils.aoa_to_sheet
将 js 数据的数组转换为工作表。
XLSX.utils.json_to_sheet
将 js 对象的数组转换为工作表。
XLSX.utils.table_to_sheet
将 DOM TABLE 元素转换为工作表。
XLSX.utils.sheet_to_json
将工作表对象转换为 JSON 对象数组。
XLSX.utils.sheet_to_csv
生成分隔符分隔值输出。
XLSX.utils.sheet_to_html
生成 HTML 输出。
XLSX.utils.sheet_to_formulae
生成公式列表(具有值回退)。
XLSX.utils.format_cell
生成单元格的文本值(使用数字格式)。
XLSX.utils.encode_row/decode_row
在 0 索引行和 1 索引行之间进行转换。
XLSX.utils.encode_col/decode_col
在 0 索引列和列名之间进行转换。
XLSX.utils.encode_cell/decode_cell
转换单元格地址。
XLSX.utils.encode_range/decode_range
转换单元格范围。
数据自定义
下面介绍几种方式来定义数据对象
整列数组
对象数组
HTML Table
阵列数组
对象数组

HTML Table
生成 xlsx 文件
js-xlsx 提供一个默认的 workBook 对象(XLSX.utils.book_new)
兄弟们,实现导出了!!

合并单元格功能
合并表格的数据在 Sheets Object 里的 !merges 属性里,它是一个数组,数组的顺序是按照二维表顺序(从左到右,从上到下)排列。

其中 s 是 start 的简写,e 是 end 的简写,c 是 column 的简写,r 是 row 的简写(这种简写方式主要是为了节约内存,想想 Excel 表里可能有上万个单元格,如果用全称实在是太浪费内存)。
项目实现
导入

导出
最后更新于