如何使用NodeJS将2个XLSX文件合并为一个

时间:2017-06-19 23:06:18

标签: javascript node.js excel xlsx

我目前正在使用NodeJS生成XLSX电子表格。我使用模块xlsx-populate在Express服务器上创建单页XLSX文件。

我想知道是否有人知道如何使用Node将多个XLSX文件合并到一个包含多个工作表的文件中。

谢谢!

示例:

const xlsx = require('xlsx-populate');

xlsx.fromFileAsync('template1.xlsx')
  .then((workbook) => {
    // populate the workbook with stuff

    return workbook.toFileAsync('spreadsheet1.xlsx');
  })
  .then(() => xlsx.fromFileAsync('template2.xlsx'))
  .then((workbook) => {
    // populate the other workbook with stuff

    return workbook.toFileAsync('spreadsheet2.xlsx');
  });

此Promise链保存两个单独的XLSX文件(spreadsheet1.xlsx,spreadsheet2.xlsx),每个文件都是从相应的模板文件构建的。 xlsx-populate不允许您在同一工作簿上的不同XLSX文件中创建多个工作表,所以我想知道是否可以将两个工作簿合并为一个具有多个工作表的工作簿?

修改

我最终将模块切换到excel4node,我发现这是一个更灵活,虽然更复杂的模块。我的问题是我有两个模板文件,每个都包含一个图像,我想使用xlsx-populate合并到一个文件中。

由于我未能找到使用xlsx-populate将两个模板合并到一个文件的成功方法,我使用excel4node从头开始重建模板文件,插入图像(xlsx-populate不支持)。

2 个答案:

答案 0 :(得分:0)

将新工作表添加到工作簿

此示例使用XLSX.utils.aoa_to_sheet制作工作表并将新工作表附加到工作簿:

var new_ws_name = "SheetJS";

/* make worksheet */
var ws_data = [
    [ "S", "h", "e", "e", "t", "J", "S" ],
    [  1 ,  2 ,  3 ,  4 ,  5 ]
];
var ws = XLSX.utils.aoa_to_sheet(ws_data);

/* Add the sheet name to the list */
wb.SheetNames.push(ws_name);

/* Load the worksheet object */
wb.Sheets[ws_name] = ws;

来自:https://www.npmjs.com/package/xlsx#streaming-read

答案 1 :(得分:0)

此代码段可以将两个excel文件合并为一个新文件。

 const XlsxPopulate = require('xlsx-populate');

 Promise.all([
    XlsxPopulate.fromFileAsync('./src/data/template.xlsx'),
    XlsxPopulate.fromFileAsync('./src/data/template2.xlsx')
 ])
  .then(workbooks => {
    const workbook = workbooks[0];
    const workbook2 = workbooks[1];
    const sheets2 = workbook2.sheets();

    sheets2.forEach(sheet => {
      const newSheet = workbook.addSheet(sheet.name());
      const usedRange = sheet.usedRange();
      const oldValues = usedRange.value();

      newSheet.range(usedRange.address()).value(oldValues);
    });

    return workbook.toFileAsync('./src/data/xlsx-populate/spreadsheet2.xlsx');
 });

已知问题:

它将失去第二种风格,因为复制风格功能正在开发中,请参考here