使用js-xlsx导出.xlsx文件时如何设置单元格宽度

jga*_*ria 29 javascript xlsx node.js

我正在尝试使用js-xlsx为我导出的excel文件设置固定的列/单元格宽度.

编辑:

以下是js-xlsx的来源:https://github.com/SheetJS/js-xlsx

数据视图

小智 67

我在这里找到了写测试的片段https://github.com/SheetJS/js-xlsx/blob/master/tests/write.js#L14-L19

有关快速参考,其中ws是您的工作表.

var wscols = [
    {wch:6},
    {wch:7},
    {wch:10},
    {wch:20}
];

ws['!cols'] = wscols;
Run Code Online (Sandbox Code Playgroud)

  • 我的猜测是这样的: ws['!merges'] = [ {s: {c: 0, r:0 }, e: {c:0, r:3}} ]}; 这会将 <column 0, row 0> (A1) 合并到 <column 0, row 3> (A3)。(参考:https://www.npmjs.com/package/node-xlsx) (2认同)

Icy*_*ool 11

扩展问题,如果您需要根据您的内容设置自动宽度,您可以这样写:

const worksheet = XLSX.utils.aoa_to_sheet(arrayOfArray);
worksheet['!cols'] = fitToColumn(arrayOfArray);

function fitToColumn(arrayOfArray) {
    // get maximum character of each column
    return arrayOfArray[0].map((a, i) => ({ wch: Math.max(...arrayOfArray.map(a2 => a2[i] ? a2[i].toString().length : 0)) }));
}
Run Code Online (Sandbox Code Playgroud)

此函数假定您的第一行包含最多的列。然后它尝试通过计算内容字符长度来找到每列中最宽的单元格。

  • @Žilvinas 扩展了@Icycool 对对象数组的回答,并防止函数在单元格为空时崩溃,因为当单元格被清除时你无法 toString 。方程中还包括列宽。`const fitToColumn = data => { const columnWidths = []; for (data[0] 中的 const 属性) { columnWidths.push({ wch: Math.max( property ? property.toString().length : 0, ...data.map(obj => obj[property] ? obj [属性].toString().length : 0 ) ) }); 返回列宽度;};` (4认同)
  • 你知道我如何让它适用于对象数组吗? (3认同)

iam*_*ord 10

没什么新东西,但显式使用该width属性使其更容易维护:

ws['!cols'] = [{ width: 20 }, { width: 20 }, { width: 150 } ]; //set col. widths
Run Code Online (Sandbox Code Playgroud)

以下是您可以赋予这些ColInfo对象的属性的完整列表,它们给出了每个宽度存在的原因,但它们指出您应该使用width> wpx> wch,具体取决于您拥有的工作表类型以及适用于您的用例的内容。更多内容可以在这里阅读: https: //docs.sheetjs.com/ 在此输入图像描述


Sri*_*tha 5

与单元格宽度类似,您可以通过以下方式设置单元格高度

var wsrows =  [
                 {hpt: 12}, // row 1 sets to the height of 12 in points
                 {hpx: 16}, // row 2 sets to the height of 16 in pixels
               ];

ws['!rows'] = wsrows; // ws - worksheet
Run Code Online (Sandbox Code Playgroud)

提示:如果工作表数据是自动生成的,并且您不知道要填充多少行和列,则可以使用以下方法查找工作表中的行和列数,以进行单元格宽度/高度格式化。

var range = XLSX.utils.decode_range(ws['!ref']);
var noRows = range.e.r; // No.of rows
var noCols = range.e.c; // No. of cols
Run Code Online (Sandbox Code Playgroud)


小智 5

public exportAsExcelFile(json: any[], excelFileName: string): void {

   const header = Object.keys(json[0]); // columns name

   var wscols = [];
   for (var i = 0; i < header.length; i++) {  // columns length added
     wscols.push({ wch: header[i].length + 5 })
   }
   const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
   worksheet["!cols"] = wscols;
}
Run Code Online (Sandbox Code Playgroud)