使用 ExcelJS 将多个工作表添加到流工作簿

use*_*588 4 node.js exceljs

语境

  • NodeJS 10
  • ExcelJS 0.8.5
  • Ubuntu 上的LibreOffice 5.1.6.2

问题

我正在尝试使用ExcelJS. ExcelJS我正在关注github 页面的官方文档。

第一步是创建工作簿。就我而言,我想要一个流,因为我会附加大量数据。

// Create Excel Workbook Stream
const workbookStream = new Excel.stream.xlsx.WorkbookWriter({
  filename: path,
  useStyles: true,
  useSharedStrings: true,
});
Run Code Online (Sandbox Code Playgroud)

然后,我将工作表添加到创建的工作簿的流中,如文档Worksheet Properties中所述。

const sheet = workbookStream.addSheet('sheet1'); // Throw here
Run Code Online (Sandbox Code Playgroud)

但这样,我得到了以下错误:

'类型错误:workbookStream.addSheet 不是函数


我还发现了一个不会抛出但不起作用并且不会创建许多工作表的代码。

const header = ['A', 'B', 'C'];

const sheet1 = Excel.addSheetOnWorkbook({
  workbook: workbookStream,
  name: 'sheet1',
});

const sheet2 = Excel.addSheetOnWorkbook({
  workbook: workbookStream,
  name: 'sheet2',
});

sheet.addRow(header).commit();

sheet.addRow(header).commit();

await workbookStream.commit();
Run Code Online (Sandbox Code Playgroud)

在本例中,仅sheet1创建 (使用LibreOffice 5.1.6.2打开)。

有什么办法可以解决这个问题吗ExcelJS

Ter*_*nox 5

我不知道这对你有多大帮助,但对我的环境来说:

  • Windows 10 (10.0.17134.0)
  • 节点10.15.0
  • Exceljs 1.6.0

一旦我设置了worksheet.stateto visible,我就可以在以下位置看到它LibreOffice

const Excel = require('exceljs');
const workbook = new Excel.Workbook();
const fs = require('fs');
const filename = "test.xlsx";
const sheetNames = ["A", "B", "C", "D"];

sheetNames.forEach(sheetName => {
    let worksheet = workbook.addWorksheet(sheetName);
    // I believe this needs to be set to show in LibreOffice.
    worksheet.state = 'visible';
});

const stream = fs.createWriteStream(filename);
workbook.xlsx.write(stream)
.then(function() {
    console.log(`File: ${filename} saved!`);
    stream.end();
}).catch(error => {
    console.err(`File: ${filename} save failed: `, error);
});
Run Code Online (Sandbox Code Playgroud)

使用流式 XLSX WorkbookWriter

const Excel = require('exceljs');
const sheetNames = ["A", "B", "C", "D"];

const workbook = new Excel.stream.xlsx.WorkbookWriter( { filename: './streamed-workbook.xlsx' } );

sheetNames.forEach(sheetName => {
    let worksheet = workbook.addWorksheet(sheetName);
    worksheet.state = 'visible';
    worksheet.commit();
});

// Finished the workbook.
workbook.commit()
.then(function() {
    console.log(`Worksheet committed!`);
});
Run Code Online (Sandbox Code Playgroud)

我也会在 Ubuntu 机器上进行测试。

XSLX 文件只是.zip包含多个.xml文件的文件,因此您可以自己检查 XML 数据。

显示 LibreOffice 与 exceljs 生成的原始 Xml (worksheet.xml):

自由办公室

const Excel = require('exceljs');
const workbook = new Excel.Workbook();
const fs = require('fs');
const filename = "test.xlsx";
const sheetNames = ["A", "B", "C", "D"];

sheetNames.forEach(sheetName => {
    let worksheet = workbook.addWorksheet(sheetName);
    // I believe this needs to be set to show in LibreOffice.
    worksheet.state = 'visible';
});

const stream = fs.createWriteStream(filename);
workbook.xlsx.write(stream)
.then(function() {
    console.log(`File: ${filename} saved!`);
    stream.end();
}).catch(error => {
    console.err(`File: ${filename} save failed: `, error);
});
Run Code Online (Sandbox Code Playgroud)

exceljs

const Excel = require('exceljs');
const sheetNames = ["A", "B", "C", "D"];

const workbook = new Excel.stream.xlsx.WorkbookWriter( { filename: './streamed-workbook.xlsx' } );

sheetNames.forEach(sheetName => {
    let worksheet = workbook.addWorksheet(sheetName);
    worksheet.state = 'visible';
    worksheet.commit();
});

// Finished the workbook.
workbook.commit()
.then(function() {
    console.log(`Worksheet committed!`);
});
Run Code Online (Sandbox Code Playgroud)

还有一件事

设置某些非字母字符时,工作表标题可能会破坏XML 文件结构。

请注意工作表标题!