15

我正在尝试使用 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});
4

4 回答 4

8

在https://github.com/guyonroche/exceljs/issues/433找到答案

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

> @mfahmirukman

/*TITLE*/
sheet.mergeCells('C1', 'J2');
sheet.getCell('C1').value = 'Client List'

/*Column headers*/
sheet.getRow(9).values = ['idClient', 'Name', 'Tel', 'Adresse'];

/*Define your column keys because this is what you use to insert your data according to your columns, they're column A, B, C, D respectively being idClient, Name, Tel, and Adresse.
So, it's pretty straight forward */
sheet.columns = [
  { key: 'idClient'},
  { key: 'name'},
  { key: 'tel'},
  { key: 'adresse'}
]

/*Let's say you stored your data in an array called arrData. Let's say that your arrData looks like this */
arrData = [{
  idClient: 1,
  name: 'Rihabbs',
  tel: '0123456789',
  adresse: 'Home sweet home'
},
{
  idClient: 2,
  name: 'mfahmirukman',
  tel: '0123456789',
  adresse: 'Indonesia'
}
]
/* Now we use the keys we defined earlier to insert your data by iterating through arrData and calling worksheet.addRow()
*/
arrData.forEach(function(item, index) {
  sheet.addRow({
     idClient: item.idClient,
     name: item.name,
     tel: item.tel,
     adresse: item.adresse
  })
})
于 2018-03-18T17:45:18.383 回答
0

@dim 答案中的 exceljs 提供的示例并没有真正像描述的那样工作。

示例用例不仅是一个非常糟糕的例子,说明了真实世界的用例可能是什么样子,它根本不起作用。在这种情况下,大多数人想要的是将表格标题作为列标签行上方的合并和居中单元格,然后可以通过键添加数据。我已经尝试了很多方法来获得sheet.columns单独保留第一行数据的功能,但它总是将列标题添加到我放在那里的任何其他内容上。

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

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

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

在标题和列标题之间添加行(如示例中所示)(再次为什么?)

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

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

我发现的解决方法是:

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

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

于 2019-06-10T18:15:59.230 回答
0

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

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

worksheet.spliceRows(1, 0, titleValues1,titleValues2);

然后获取行并根据需要进行合并或操作。

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

于 2019-11-02T19:22:39.250 回答
0

取自 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)
于 2021-06-16T08:19:31.170 回答