如何让ExcelJs导出的Excel默认自动适配列宽与行高?
解决方案:用ExcelJS实现导出时自动调整列宽和行高
完全可行,你需要手动实现列宽自动适配内容和行高自适应换行内容,对应手动双击行列边的效果,以下是具体实现:
1. 核心逻辑说明
- 行高自适应:你已经开启了
wrapText: true,只需额外设置autoHeight: true,ExcelJS会自动根据换行后的内容计算行高。 - 列宽自动适配:ExcelJS没有内置自动列宽方法,需要遍历每列所有单元格,计算内容的最大显示宽度,再设置列宽(注意中文/全角字符占2个单位宽度,英文/半角占1个)。
2. 修改后的完整代码
const workbookNew = new ExcelJS.Workbook(); const worksheetNew = workbookNew.addWorksheet('User Data'); // Add headers const headers = Object.keys(newdata[0]); worksheetNew.addRow(headers); // Add data newdata.forEach((item) => { const row: any = []; headers.forEach((header) => { row.push(item[header]); }); worksheetNew.addRow(row); }); // 处理行对齐+行高自适应 for (let rowIndex = 1; rowIndex <= worksheetNew.rowCount; rowIndex++) { const row = worksheetNew.getRow(rowIndex); row.alignment = { vertical: 'middle', horizontal: 'left', wrapText: true }; row.autoHeight = true; // 开启行高自动适配 } // 计算并设置列宽 headers.forEach((_, colIndex) => { const column = worksheetNew.getColumn(colIndex + 1); // ExcelJS列从1开始计数 let maxWidth = 0; // 遍历该列所有单元格,计算最大宽度 column.eachCell({ includeEmpty: false }, (cell) => { // 计算内容宽度:中文/全角字符算2,英文/半角算1 const cellWidth = cell.value ? cell.value.toString().split('').reduce((width, char) => { return width + (char.match(/[\u4e00-\u9fa5]/) ? 2 : 1); }, 0) : 0; // 额外加2个单位的边距,避免内容贴边 maxWidth = Math.max(maxWidth, cellWidth + 2); }); // 设置列宽(Excel的列宽单位约等于字符数) column.width = maxWidth; }); workbookNew.xlsx.writeBuffer().then((buffer: any) => { const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); FileSaver.saveAs(blob, `${excelFileName}.xlsx`); });
3. 关键细节
- 列宽计算时加入了边距补偿,避免内容紧贴单元格边缘;
autoHeight: true会配合wrapText: true自动调整行高,无需手动设置固定值;- 遍历单元格时跳过空单元格,提升计算效率。
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

