sheetJs/xlsx是JavaScript中一个常用的操作Excel的库。我们可以使用它来读写excel文件。在下面的文章中,会把sheetJs/xlsx
统一为xlsx
。
读Excel文件
我们可以通过xlsx
来读取excel文件。当我们要读取excel时,我们可以使用读取文件的形式。在这里我们需要使用的是readFile
方法,xlsx
的readFile
方法接受一个文件名和一个可选项。返回一个workbook对象。
示例:
import { readFile } from 'xlsx';
const workbook = readFile('./example.xlsx',{});
const ws = workbook.Sheets["Sheet1"];
写Excel文件
在xlsx
中,有worksheet和workbook的概念。其中workbook就一个excel文件,而worksheet就是组成excel文件的sheet。
一个简单的创建excel
的例子如下:
import { utils, writeFileXLSX } from 'xlsx';
const workSheet = utils.json_to_sheet([{ name: 'Tim', sex: 'boy'}, { name: 'Jhon', sex: 'boy' }]);
const workBook = utils.book_new();
utils.book_append_sheet(workBook, workSheet);
writeFileXLXS(workBook, 'example.xlsx');
创建worksheet
要创建一个worksheet文件,在xlsx
中有很多的方法。比较常用的是json_to_sheet
方法。我们可以通过这个方法把一个json
转换成一个sheet
。其返回值是一个workSheet
对象。如果要创建一个空的sheet对象可以使用这样的方法。
import { utils } from 'xlsx';
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
对应的表示为:
const range = {
s: {
r: 0,
c: 0
},
e: {
r: 1,
c: 1
}
}
在了解了xlsx
的单元格地址和范围的表示方式后,我们就可以来了解xlsx
中合并单元格的方法了。要在xlsx
中使用合并单元格,可以通过给ws['!merges']
赋值来实现。ws['!merges']
接收一个Range
的数组,也就是一个范围的数组。这个数组中的每一个范围都是会合并成一个单元格。如下会把A1:A2
合并成一个单元格。
const range = {
s: {
r: 0,
c: 0
},
e: {
r: 0,
c: 1
}
};
ws['!merges']=[range]; // ws是`xlsx`中的一个workSheet对象
单元格对象
在xlsx
中,单元格对象是一个纯粹的JS对象,它的keys和values的关系如下:
Key | 描述 |
---|---|
v | value,即原始值 |
w | 格式化后的文本(如果可以使用) |
t | type,即类型: - b Boolean- e Error- n Number- d Date- s Text- z Stub |
f | 单元格公式编码为A1样式的字符串(如果可以使用) |
F | 如果公式是数组公式,则包围数组的范围(如果可以使用) |
r | 富文本编码(如果可以使用) |
h | 富文本渲染成HTML(如果可以使用) |
c | 与单元格关联的注释 |
z | 与单元格关联的数字格式字符串(如果有必要) |
l | 单元格的链接对象 - .Target 长联接 - .Tooltip 提示消息 |
s | 单元格的样式/主题(如果可以使用) |
如果w
文本可以使用,内置的导出工具(比如CSV导出方法)就会使用它。要想改变单元格的值,在打算导出之前确保删除cell.w
(或者设置cell.w
为undefined
)。工具函数会根据数字格式(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_row
在0-indexed
行形式和1-indexed
行形式 之间转换encode_col / decode_col
在0-indexed
列形式和1-indexed
列形式之前转换encode_cell / decode_cell
转换单元格地址encde_range / decode_range
转换单元格范围
示例:
import { utils } from 'xlsx';
// A1
utils.encode_cell({
r: 0,
c: 0
});
// {r: 0, c:0};
utils.decode_cell("A1");
// A1:C3
utils.encode_range({
s: {
r: 0,
c: 0,
},
e: {
r: 2,
c: 2
}
})
// {s:{ r: 0, c: 0}, e:{ r: 2, c: 2}}
utils.decode_range("A1:C3");
欢迎赞赏