sheetJs/xlsx是JavaScript中一个常用的操作Excel的库。我们可以使用它来读写excel文件。在下面的文章中,会把sheetJs/xlsx统一为xlsx

读Excel文件

我们可以通过xlsx来读取excel文件。当我们要读取excel时,我们可以使用读取文件的形式。在这里我们需要使用的是readFile方法,xlsxreadFile方法接受一个文件名和一个可选项。返回一个workbook对象。
示例:

  1. import { readFile } from 'xlsx';
  2. const workbook = readFile('./example.xlsx',{});
  3. const ws = workbook.Sheets["Sheet1"];

写Excel文件

xlsx中,有worksheet和workbook的概念。其中workbook就一个excel文件,而worksheet就是组成excel文件的sheet。

一个简单的创建excel的例子如下:

  1. import { utils, writeFileXLSX } from 'xlsx';
  2. const workSheet = utils.json_to_sheet([{ name: 'Tim', sex: 'boy'}, { name: 'Jhon', sex: 'boy' }]);
  3. const workBook = utils.book_new();
  4. utils.book_append_sheet(workBook, workSheet);
  5. writeFileXLXS(workBook, 'example.xlsx');

创建worksheet

要创建一个worksheet文件,在xlsx中有很多的方法。比较常用的是json_to_sheet方法。我们可以通过这个方法把一个json转换成一个sheet。其返回值是一个workSheet对象。如果要创建一个空的sheet对象可以使用这样的方法。

  1. import { utils } from 'xlsx';
  2. const workSheet = utils.json_to_sheet([]);

合并单元格

要在xlsx中使用合并单元格的功能。在合并之前要先了解一下在xlsx中的excel单元格地址的表示方式。在xlsx中,单元格的地址的表示方式使用了一个叫做CellAddress的类型来表示。其形式为{r: number, c: number}。其中,r表示行数,同时c表示列数。比如{r: 0, c: 0}表示的就是第一行,第一列的单元格,即excel中的A1单元格。
在了解了xlsx中的单元格的表示方式后,我们再来了解一下xlsx中是怎么表示一个范围的单元格。在xlsx中,通过Range的方式来表示一定范围内的单元格。而Range的形式为{ s: CellAddress, e: CellAddress}。其中,s表示的是范围的开始地址(s即是start的意思),同时e表示的是范围的结束地址(e即是end的意思)。Range在excel中对应的形式是A1:B2这样的形式。如A1:B2对应的表示为:

  1. const range = {
  2. s: {
  3. r: 0,
  4. c: 0
  5. },
  6. e: {
  7. r: 1,
  8. c: 1
  9. }
  10. }

在了解了xlsx的单元格地址和范围的表示方式后,我们就可以来了解xlsx中合并单元格的方法了。要在xlsx中使用合并单元格,可以通过给ws['!merges']赋值来实现。
ws['!merges']接收一个Range的数组,也就是一个范围的数组。这个数组中的每一个范围都是会合并成一个单元格。如下会把A1:A2合并成一个单元格。

  1. const range = {
  2. s: {
  3. r: 0,
  4. c: 0
  5. },
  6. e: {
  7. r: 0,
  8. c: 1
  9. }
  10. };
  11. ws['!merges']=[range]; // ws是`xlsx`中的一个workSheet对象

单元格对象

xlsx中,单元格对象是一个纯粹的JS对象,它的keys和values的关系如下:

Key 描述
v value,即原始值
w 格式化后的文本(如果可以使用)
t type,即类型:
- b Boolean
- e Error
- n Number
- dDate
- sText
- z Stub
f 单元格公式编码为A1样式的字符串(如果可以使用)
F 如果公式是数组公式,则包围数组的范围(如果可以使用)
r 富文本编码(如果可以使用)
h 富文本渲染成HTML(如果可以使用)
c 与单元格关联的注释
z 与单元格关联的数字格式字符串(如果有必要)
l 单元格的链接对象
- .Target 长联接
- .Tooltip 提示消息
s 单元格的样式/主题(如果可以使用)

如果w文本可以使用,内置的导出工具(比如CSV导出方法)就会使用它。要想改变单元格的值,在打算导出之前确保删除cell.w(或者设置cell.wundefined)。工具函数会根据数字格式(cell.z)和原始值(如果可用)重新生成w文本。

工具集

为了方便,在下文中把workbook称为工作簿,worksheet称为工作表。
xlsx中通过 utils提供了几个比较常用的工具集。主要内容如下:
创建工具集:

  • book_new 创建一个新的工作簿
  • book_append_sheet 把一个已有的工作表加人到一个已有的工作簿中

导入工具集:

  • aoa_to_sheet把JS中的二维数组转换为一个工作表
  • json_to_sheet 把一个JS对象数组转换为一个工作表
  • table_to_sheet 把一个 TABLE的DOM对象转换为一个工作表
  • sheet_add_aoa 把一个二维数组对象添加到一个现有的工作表中
  • sheet_add_json 把一个JS对象数组添加为一个现有的工作表中

导出工具集:

  • sheet_to_json转换一个工作表对象为一个JSON数组
  • sheet_to_txt把一个工作表生成一个编码为UTF16的文本对象。
  • sheet_to_csv把一个工作表生成一个逗号分隔符的输出
  • sheet_to_html把一个工作表转换为一个HTML输出
  • sheet_to_formulae从一个工作表中生成一个公式列表

单元格和单元格地址操作:

  • format_cell生成 一个单元格文本
  • encode_row / decode_row0-indexed 行形式和1-indexed行形式 之间转换
  • encode_col / decode_col0-indexed列形式和1-indexed列形式之前转换
  • encode_cell / decode_cell转换单元格地址
  • encde_range / decode_range转换单元格范围

示例:

  1. import { utils } from 'xlsx';
  2. // A1
  3. utils.encode_cell({
  4. r: 0,
  5. c: 0
  6. });
  7. // {r: 0, c:0};
  8. utils.decode_cell("A1");
  9. // A1:C3
  10. utils.encode_range({
  11. s: {
  12. r: 0,
  13. c: 0,
  14. },
  15. e: {
  16. r: 2,
  17. c: 2
  18. }
  19. })
  20. // {s:{ r: 0, c: 0}, e:{ r: 2, c: 2}}
  21. utils.decode_range("A1:C3");

欢迎赞赏
欢迎赞赏