xlsx处理合并单元格

2 阅读2分钟

当 Excel 表格中有合并单元格时,使用 xlsx 库可以读取这些单元格,但需要特别处理以确保数据的一致性。合并单元格通常会被表示为一个区域(例如 A1:B2),并且只有左上角的单元格会存储实际的值,其他单元格会被视为空值。

处理合并单元格的步骤

  1. 读取合并单元格信息: xlsx 库中的 !merges 属性可以获取工作表中所有合并单元格的范围。
  2. 展开合并单元格: 根据 !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: '' 用于指定在单元格没有值时使用的默认值。

通过这种方式,所有合并单元格的值都将正确填充到对应的区域,使得在后续的数据处理过程中更加一致和容易。