js-xlsx实现纯前端导出excel表格

js-xlsx

没有需求就没有方法

最近接到一个新需求,需求乍一看很简单,就是在价格数据表格页面增加一个数据导出功能。然而在开发过程中,遇到了这儿样那样的问题。

后端同事说他那边只支持返回 json 数据,但是对于太大的数据量他那边只能限制导出的时候进行限量。这就很尴尬,前端如何将 json 数据成功导出为用户使用的 excel 文件?

项目使用的是 iVewUI 库。库中只提供了导出格式为 .csv 格式。这就很尴尬,需要自己实现。

废话不多说,来到今天的主题 js-xlsx 实现纯前端导出 excel 表格

js-xlsx

js-xlsx 是一个纯 JavaScript 实现的,能运行在所有 JavaScript 环境中,包括浏览器,NodeJs 等的 excel 库,能够读取和写入 excel 表格。

兼容性如下图: 3llI6f.png

下面开始介绍 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 看看它主要有哪些属性

3lJhsx.png
  • SSF 里定义了一些数据格式

  • parse 里解析相关

  • read 用来读取 xlsx 文件的 API

  • write 用来把数据写入并生成 xlsx 文件的 API

  • version 指的是 js-xlsx 的版本号

直接跳转实现例子

读取 Excel 数据

为了解析数据,第一步就是读取文件,这里有几个不同的地方

  • 通过文件 IO 获取数据

  • 因为 Excel 数据表与 HTML Table 结构是相应的,所以也可以从 Table 里获取数据

3lNvO1.png
  • 通过 url (ajax) 获取数据

左边为输出内容,右边为表格数据

3ldEZt.png
  • 通过 HTML5 文件拖拽获取数据

3lDx3T.gif

HTML5 拖拽上传文件请点击查看

js-xlsx 的解析数据 API

函数
描述

XLSX.read(data, read_opts)

尝试解析 data

XLSX.readFile(filename, read_opts)

根据文件路径名,继续解析

workBook

workBook 就是读取 Excel 数据后的 json 对象,里面记录着 Excel 的数据信息

3lsqf0.png
  • Custprops 存储自定义属性

  • Workbook 存储工作簿属性

  • SSF 定义一些数据格式

  • Directory 是 Excel 文件的描述对象

  • Props 是 xlsx 文件的属性

  • SheetNames 里存储着每个 Sheet 的名字

  • Sheets 里面存储的是每个 Sheet 的数据

每个 Sheet 对象里都根据坐标存储 Excel 的二维数据,其中 !ref 代表这个表的范围

3l6yGt.png

对应的是 Excel 表数据

3l6Wqg.png

其中 Strings 是一个数组,他按照从左到右,从上到下的顺序来把二维的数据降到一维

单元格对象

在下图中 A1 就是一个单元格对象,它代表着 Excel 二维表里的 A1 位置的单元格对象。

3lcQQf.png
属性
描述

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

阵列数组

对象数组

319Gx1.png

HTML Table

生成 xlsx 文件

js-xlsx 提供一个默认的 workBook 对象(XLSX.utils.book_new)

兄弟们,实现导出了!!

31ksD1.png

合并单元格功能

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

31nSr4.png

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

项目实现

导入

31u4BQ.png

导出

最后更新于