使用ExcelJS处理Excel电子表格文件

220 阅读2分钟

最近收到一个任务,需要处理多个Excel文件,将其中的几列抽离出来汇总到一个单独的文件中。

由于文件中的数据过多,手动处理的话出错的可能性很大且效率比较低,于是使用了ExcelJS编写了一个脚本。

依赖安装

npm install exceljs

ExcelJS中文文档链接:点击查看

安装完依赖后,修改packge.jsontypemodule,这样就能使用ESModule的语法了。

操作步骤

创建sourceWorkBook和targetWorkBook,分别用于读取文件和写入文件。

READ_PATH是需要读取的文件的路径,需要自己定义。

import ExcelJS from "exceljs";

// 用于读取文件
const sourceWorkBook = new ExcelJS.Workbook();
// 用于写入文件
const targetWorkBook = new ExcelJS.Workbook();

try {
  await sourceWorkbook.xlsx.readFile(READ_PATH);
  console.log("读取成功");
} catch (error) {
  console.log("读取失败", error);
}

创建工作表

接下来找到需要读取文件中的哪一个表,这里以Sheet1为例。然后在汇总文件中也创建一个表,这里也叫做Sheet1了。

// 找到要读取的表
const sourceWorksheet = sourceWorkBook.getWorksheet("Sheet1");
// 在汇总表中创建一个新的工作表
const targetWorksheet = targetWorkbook.addWorksheet("Sheet1");

写入

遍历源工作表中的所有数据,并将其添加到汇总表中。

WRITTEN_PATH同理,是写入文件的路径,需要自己定义。

sourceWorksheet.eachRow((row, rowNumber) => {
  const targetRow = targetWorksheet.getRow(rowNumber);
  row.values.forEach((cell, colNumber) => {
    targetRow.getCell(colNumber).value = cell;
  });
  targetRow.commit();
});

try {
  await targetWorkbook.xlsx.writeFile(WRITTEN_PATH);
  console.log("数据写入汇总成功");
} catch (error) {
  console.log("数据写入汇总失败", error);
}

追加写入

后续的写入就稍微麻烦一些,首先需要找到追加的开始行,使用工作表的rowCount属性即可

let startRowNumber = targetWorksheet.rowCount + 1;

然后需要处理表头,第一行是表头,所以需要跳过,判断 rowNumber=1 时直接返回。

但跳过后该行就成了空白,所以需要多减去一行空白行。

source2WorkSheet.eachRow((row, rowNumber) => {
  if (rowNumber === 1) return;
  // 假设需要的数据在第1,3,5列
  const name = row.getCell(1).value;
  const age = row.getCell(3).value;
  const sex = row.getCell(5).value;
  // 多减去一行空白行
  const targetRow = targetWorksheet.getRow(startRowNumber + rowNumber - 2);
  // 假设写入的数据在第1,2,3列
  targetRow.getCell(1).value = name;
  targetRow.getCell(2).value = age;
  targetRow.getCell(3).value = sex;
  targetRow.commit();
});

最后写入即可。

try {
  await summaryWorkbook.xlsx.writeFile(WRITTEN_PATH);
  console.log("数据写入汇总成功");
} catch (error) {
  console.log("数据写入汇总失败", error);
}