无需第三方库的HTML导出Excel行列转换、列宽设置及格式调整问题
解决方案
首先说明:没有专门用于HTML导出Excel的原生HTML标签,你当前使用的data:application/vnd.ms-excel URI搭配SpreadsheetML格式XML的方案就是无需第三方库的原生实现方式。
1 行列方向转换实现
不需要重写整体逻辑,仅调整遍历顺序即可完成行列转置,调整后的追加数据逻辑如下:
// 先获取最大列数,避免数组长度不一致导致数据丢失 const maxColLen = Math.max(..._filterData.map(item => item.getAppliedValues().length)) rowsXML = '' // 外层循环遍历列索引,把每一列转为Excel的一行 for (let a = 0; a < maxColLen; a++) { rowsXML += '<Row>' // 内层循环遍历所有数据行,取当前列索引对应的值 for (let i = 0; i < _filterData.length; i++) { const colValues = _filterData[i].getAppliedValues() const filtervalue = a < colValues.length ? colValues[a].formattedValue : '' ctx = { nameType: 'String', data: filtervalue }; rowsXML += format(tmplCellXML, ctx); } rowsXML += '</Row>' }
调整后即可将原来纵向排布的数据转为横向排布。
2 原生预设列宽实现
可以直接通过你当前使用的Office XML原生标签实现,无需依赖第三方库:
你需要修改tmplWorksheetXML模板,在<Table>标签下增加<Column>标签指定列宽,示例如下:
// 修改后的工作表模板,增加ss:Column标签配置列宽,ss:Width单位为磅 tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>' + // 示例配置3列,列宽分别为80、120、150,你可以根据实际列数调整数量和数值 '<Column ss:Width="80"/>' + '<Column ss:Width="120"/>' + '<Column ss:Width="150"/>' + '{rows}</Table></Worksheet>'
如果列数不固定,你可以动态生成对应数量的<Column>标签拼入模板即可。对应的语法规则可以参考微软官方发布的Office XML电子表格格式规范。
内容的提问来源于stack exchange,提问作者Farid Arshad
相关产品推荐
相关产品推荐

