【问题标题】:Add rows before the column header using excel.js module + node使用 excel.js 模块 + 节点在列标题前添加行
【发布时间】:2021-06-16 16:19:31
【问题描述】:

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

【问题讨论】:

  • 您找到解决此问题的方法了吗? @玛丽亚
  • 不,我通过将文本添加到带有索引的行来处理它

标签: javascript node.js excel exceljs


【解决方案1】:

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
  })
})

【讨论】:

  • 在代码中的何处定义了样式以使标题背景变为蓝色?
【解决方案2】:

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

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

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

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

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

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

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

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

我发现的解决方法如下:

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

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

【讨论】:

    【解决方案3】:

    您可以在第 1 行进行拼接,去除 0 并添加行值

    titleValues1 = ["colA1","colb1"];
    titleValues2 = ["colA2","colb2"];
    
    worksheet.spliceRows(1, 0, titleValues1,titleValues2);
    

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

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

    【讨论】:

      【解决方案4】:

      取自 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)
      

      【讨论】:

        猜你喜欢
        • 2016-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-04
        • 2019-05-27
        • 2020-06-06
        • 2010-12-11
        相关资源
        最近更新 更多