layui.excel.makeColConfig需配合exportExcel的extend选项中'!cols'键使用才生效,列字母须大写连续(如A-D),数值为字符宽度(80–200宜),第二参数为默认列宽;漏传extend或键名错误、列序不匹配、未启用自动换行均会导致失效。
layui.excel.makeColConfig 怎么用才不白配
直接调用 excel.makecolconfig 但没生效?大概率是传参格式或导出方式错了。它只负责生成 sheetjs 兼容的 !cols 配置对象,不会自动挂载——必须手动塞进 exportexcel 的 extend 选项里。
常见错误:把列宽配置写成 {'A': 120, 'B': 150} 就完事,结果导出后还是默认宽度。原因是你没告诉 exportExcel 去用这个配置。
- 列字母必须大写,且从
A开始连续(比如导出 4 列,就得配A–D,不能跳C) - 数值单位是「字符宽度」,不是像素;100 ≈ 14 个中文字符宽度,实测建议 80–200 区间微调
- 第二个参数是默认列宽,当某列没在对象里显式声明时,就用这个值兜底
- 如果表格列数动态变化(比如用户勾选列),得先算好字段顺序,再按顺序映射到 A/B/C…
导出时怎么把 colConfig 正确传进去
excel.exportExcel 的第四个参数是配置项,extend 是唯一能透传 SheetJS 原生配置的地方。漏掉这层包裹,makeColConfig 返回的对象就只是个普通 JS 对象,Layui 不会识别。
正确写法示例:
const colConf = excel.makeColConfig({
'A': 120, // 第一列(如“用户名”)
'B': 180, // 第二列(如“备注”,内容长需加宽)
'C': 100 // 第三列(如“状态”)
}, 100);
excel.exportExcel({
sheet1: data
}, '导出数据.xlsx', 'xlsx', {
extend: {
'!cols': colConf // ← 必须放这里,且 key 名固定为 '!cols'
}
});
注意:exportExcel 第一个参数如果是对象(带 sheet1),就表示多表;如果是数组,就是单表。列宽配置对两种都有效,但别把 !cols 错放到顶层对象里。
动态列场景下怎么算 A/B/C 对应哪一列
用户自定义导出字段时,列顺序由你拼的 data 数组决定,不是原始表格的列序。比如你让用户勾选了 ['real_name', 'dept', 'create_time'],那导出数据每行就是 {real_name: '张三', dept: '技术部', create_time: '2026-04-20'} —— 这时 A 对应 real_name,B 对应 dept,C 对应 create_time。
- 别依赖
table.config.cols取 field 顺序,它反映的是渲染顺序,可能含隐藏列或操作列 - 构造
data时用map显式提取字段,同时记录字段名数组:const fields = ['real_name', 'dept', 'create_time']; const data = tableData.map(row => _.pick(row, fields)); - 再用
fields.map((_, i) => String.fromCharCode(65 + i))生成 A/B/C 列字母数组,和makeColConfig配合用
列宽设了但 Excel 打开还是挤在一起?
有两个隐蔽原因常被忽略:
- Excel 客户端(尤其是 Mac 版)默认关闭「自动换行」,即使列宽够,超长文本仍会溢出或截断。必须配合
excel.setExportCellStyle给对应列单元格加alignment: { wrapText: true } - 某些旧版
lay-excel(如 v1.0 以下)的makeColConfig实现有 bug,返回的!cols缺少width字段,只写了maxWidth。检查生成的colConf对象是否含w: 120这样的键值对,没有就升级插件或手动补全 - 导出文件后不要双击用预览打开,要用 Excel 正式客户端打开——系统预览器不解析
!cols
列宽本质是给 Excel 客户端的提示,不是强制约束。真正影响显示效果的,是列宽 + 自动换行 + 字体大小三者共同作用的结果。


















