Javascript 使用excel.js模块+;节点

Javascript 使用excel.js模块+;节点,javascript,node.js,excel,exceljs,Javascript,Node.js,Excel,Exceljs,我正在尝试使用node.js中的excel.js模块创建xslx文件。我能够创建列并添加其值。但是,我需要在列标题前插入一些行,在那里我可以有一些描述。我该怎么做 任何帮助都将不胜感激 我试过的代码是 var worksheet = workbook.getWorksheet(1); worksheet.mergeCells('A1:B1'); var row = worksheet.getRow(1); row.getCell(1).value =' Hel

我正在尝试使用node.js中的excel.js模块创建xslx文件。我能够创建列并添加其值。但是,我需要在列标题前插入一些行,在那里我可以有一些描述。我该怎么做

任何帮助都将不胜感激

我试过的代码是

     var worksheet = workbook.getWorksheet(1);
    worksheet.mergeCells('A1:B1');
    var row = worksheet.getRow(1);
    row.getCell(1).value =' Hello, World!'; 
   // ... merged cells are linked 
    worksheet.getCell('A1').value = 'PI';
    worksheet.columns = [
        {header: 'Id', key: 'id', width: 10},
        {header: 'Name', key: 'name', width: 32},
        {header: 'complexity', key: 'complexity', width: 10},
        {header: 'hours', key: 'hours', width: 10},
        {header: 'cost', key: 'cost', width: 10}
    ];
     worksheet.addRow({name:'m', complexity: 'd', hours:5, cost: 7});
找到答案

>@rihabbs:我需要像这个例子那样做 [![在此处输入图像描述][1][1] [1]: https://i.stack.imgur.com/9oRE4.png

>@mfahmirukman


来自@dim answer的exceljs提供的示例并没有真正按照所描述的那样工作

这个示例用例不仅是一个非常糟糕的例子,说明了现实世界中的用例可能是什么样子,而且根本不起作用。在这种情况下,大多数人希望在列标签行上方有一个表头作为合并的居中单元格,然后可以按键添加数据。我尝试了很多方法来获得
sheet.columns
功能,使第一行数据不受影响,但它总是在我放在那里的任何其他数据上添加列标题

我试过: 在定义
sheet.columns
之前添加标题值(如示例所示)

在定义
sheet.columns
之前,将列标题添加为原始列表(如示例所示)

将合并的标题单元格与表中使用的列进行偏移(如示例所示)(为什么会有人这样做?)

在标题和列标题之间添加行(如示例中所示)(再次说明原因?)

将多行合并到标题单元格中(如示例所示)

除了标题单元格中的最后一个列键(使用Microsoft Excel),所有这些都不会为我提供任何信息。定义
sheet.columns
的时间似乎与定义的表的范围无关。我确信添加一个位于实际表列之外的标题单元格是可行的,但是,正如我所说的,对于大多数标准用例来说,这不是很有用

我发现的解决办法如下:

  • 将最后一列作为工作表。列a使用表标题作为键,在标题行中不包含任何内容,并确保没有使用该键的表数据(缺点是标题与表数据外的额外列合并,使其看起来有点滑稽和偏离中心)
  • 将标题单元格放在第二行,标题放在第三行,并设置
    sheet.getRow(1).hidden=true
    以隐藏不可避免地出现在第一行的标题(缺点是工作表从第二行开始,没有明显的原因)

我沿着第一种解决方法的路径开始,在表的两端装订空列,以至少平衡标题单元格,但它看起来太奇怪了,所以我决定使用第二种解决方法。

您可以在第一行拼接,删除0并添加行值

titleValues1 = ["colA1","colb1"];
titleValues2 = ["colA2","colb2"];

worksheet.spliceRows(1, 0, titleValues1,titleValues2);
然后获取行并按照您的需要进行合并或操作


希望这能满足您(或将来的任何人)的需要。

摘自Dim的答案,但在要求添加标题之前,我已经有了代码。因此,在尽可能少的变化下,它看起来是这样的:

fields = [{key:'a', width:12}, {key:'b', label:'2nd', width:15}, {key:'c', width:12}]
data = [{a:'a', b:'b', c:'c'},...]

// first add header info, then
worksheet.columns = fields
const titles = worksheet.addRow(this.fields.map(f => f.label || f.key))
// uncomment following line to freeze header and column title rows
// worksheet.views = [{state: 'frozen', ySplit: worksheet.lastRow._number}]
const dataRows = worksheet.addRows(data)

你找到解决这个问题的办法了吗@MariyaYou有@Mariyanope的答案吗,我通过在带有索引的行中添加文本来处理它,在代码中,样式被定义为使标题背景为蓝色?
fields = [{key:'a', width:12}, {key:'b', label:'2nd', width:15}, {key:'c', width:12}]
data = [{a:'a', b:'b', c:'c'},...]

// first add header info, then
worksheet.columns = fields
const titles = worksheet.addRow(this.fields.map(f => f.label || f.key))
// uncomment following line to freeze header and column title rows
// worksheet.views = [{state: 'frozen', ySplit: worksheet.lastRow._number}]
const dataRows = worksheet.addRows(data)