最近收到一个任务,需要处理多个Excel文件,将其中的几列抽离出来汇总到一个单独的文件中。
由于文件中的数据过多,手动处理的话出错的可能性很大且效率比较低,于是使用了ExcelJS编写了一个脚本。
依赖安装
npm install exceljs
ExcelJS中文文档链接:点击查看
安装完依赖后,修改packge.json的type为module,这样就能使用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);
}