当 Excel 表格中有合并单元格时,使用 xlsx
库可以读取这些单元格,但需要特别处理以确保数据的一致性。合并单元格通常会被表示为一个区域(例如 A1:B2
),并且只有左上角的单元格会存储实际的值,其他单元格会被视为空值。
处理合并单元格的步骤
- 读取合并单元格信息:
xlsx
库中的!merges
属性可以获取工作表中所有合并单元格的范围。 - 展开合并单元格: 根据
!merges
属性的范围信息,将合并单元格的值填充到所有相关单元格中。
示例代码
以下是处理包含合并单元格的 Excel 文件的示例代码:
import * as XLSX from 'xlsx';
// 读取 Excel 文件
const file = './your-file.xlsx';
const workbook = XLSX.readFile(file);
// 选择第一个工作表
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// 解析合并单元格信息
const merges = worksheet['!merges'] || [];
// 将工作表转换为 JSON
let data = XLSX.utils.sheet_to_json(worksheet, { defval: '' });
// 展开合并单元格
merges.forEach(merge => {
const { s, e } = merge; // s: start, e: end
const startCell = XLSX.utils.encode_cell(s);
const cellValue = worksheet[startCell].v;
for (let row = s.r; row <= e.r; row++) {
for (let col = s.c; col <= e.c; col++) {
const cellAddress = XLSX.utils.encode_cell({ r: row, c: col });
worksheet[cellAddress] = { v: cellValue };
}
}
});
// 重新生成 JSON 数据
data = XLSX.utils.sheet_to_json(worksheet, { defval: '' });
console.log(data);
代码解析
- 读取文件:
XLSX.readFile(file)
读取 Excel 文件。 - 获取工作表:通过
workbook.Sheets[sheetName]
获取工作表数据。 - 解析合并单元格:
worksheet['!merges']
返回一个数组,其中每个元素描述了一个合并单元格的范围。 - 展开合并单元格:遍历
merges
,将合并单元格的值填充到所有相关的单元格中。
注意
- 性能考虑:如果 Excel 文件非常大,处理合并单元格可能会比较耗时,特别是在包含大量合并单元格的情况下。
defval
参数:defval: ''
用于指定在单元格没有值时使用的默认值。
通过这种方式,所有合并单元格的值都将正确填充到对应的区域,使得在后续的数据处理过程中更加一致和容易。