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- dDate- sText- 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';// A1utils.encode_cell({r: 0,c: 0});// {r: 0, c:0};utils.decode_cell("A1");// A1:C3utils.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");
欢迎赞赏
