当前位置:首页 > AI技术 > 正文内容

开发Layui表格导出Excel如何自动合并具有相同ID的单元格|Duuu笔记

admin1周前 (04-09)AI技术22

生产环境中的前端应用实践

必须使用 SheetJS 手动构造合并,因 layui.exportFile() 仅支持纯数据导出,无单元格合并能力;需遍历分组计算行范围,设置 ws['!merges'] 并用 XLSX.writeFile 输出真实 .xlsx 文件。

layui table 导出 Excel 时怎么合并相同

id

的行?

layui 自带的

table.exportfile()

不支持单元格合并,导出的是纯数据表格,所有单元格独立存在。想按

id

合并,必须绕过它,自己构造 excel 文件。

为什么不能直接用

table.exportFile()

实现合并?

因为这个方法底层调用的是简单 CSV 或 JSON 转 Sheet 的逻辑,没有 Excel 格式控制能力,更不提供

mergeCells

rowspan

这类操作接口。你传给它的数据是扁平数组,它就原样打出来。

导出格式固定为

.csv

.xls

(非真正的 Excel),不支持样式、合并、公式

即使你提前把数据“拼成”带空字符串的结构(比如第二行

id

设为空),Excel 打开后也不会自动合并——那只是视觉错觉,实际仍是独立单元格

浏览器端无法用原生 JS 操作 Excel 的单元格合并逻辑,必须依赖专门的库

xlsx

+

SheetJS

手动合并

id

单元格的实操要点

推荐用

SheetJS

(即

xlsx

包)生成真实

.xlsx

文件,在写入前手动计算哪些行的

id

相同,然后加

!merges

先用

table.cache['your-id']

拿到当前表格的原始数据(含排序、筛选后结果)

遍历数据,按

id

分组,记录每组起始行索引和长度(注意:Excel 行号从 1 开始,JS 数组从 0 开始,要 +1)

构建

ws['!merges'] = [ { s: { r: 0, c: 0 }, e: { r: 2, c: 0 } } ]

这样的合并区域数组,

r

是行,

c

是列(

id

在第 0 列就填

c: 0

XLSX.utils.aoa_to_sheet()

转二维数组,再挂上

!merges

,最后

XLSX.writeFile()

示例关键片段:

独响

一个轻笔记+角色扮演的app

下载

const data = table.cache['demo']; // 假设你的 table id 是 demo

const merges = [];

let i = 0;

while (i < data.length) {

const startRow = i;

const idVal = data[i].id;

while (i < data.length && data[i].id === idVal) i++;

const endRow = i - 1;

if (endRow > startRow) {

merges.push({

s: { r: startRow + 1, c: 0 }, // +1 因为第 0 行是表头

e: { r: endRow + 1, c: 0 }

});

}

}

const ws = XLSX.utils.aoa_to_sheet([['ID', 'Name', 'Time'], ...data.map(d => [d.id, d.name, d.time])]);

ws['!merges'] = merges;

XLSX.writeFile(ws, 'merged.xlsx');

容易被忽略的细节和坑

合并不是“看起来一样就行”,Excel 解析和打印行为对合并区域很敏感。

!merges

中的行列索引必须严格连续,不能重叠、不能交叉,否则 Excel 打开报错或显示异常

表头行(第 0 行)不能参与合并,否则

s.r

写成 0 就会把表头也卷进去

如果表格启用了

scrollbar

或虚拟滚动,

table.cache

可能只含当前页数据——得确认你导出的是全量还是当前页

合并只作用于单列;若需多列(如

id

name

同时合并),要分别计算每列的合并区间,并确保它们对齐,否则 Excel 会拒绝打开文件

真正麻烦的不是写代码,而是校验合并逻辑是否覆盖所有边界情况:空数据、单条数据、跨页分组、ID 为 null/undefined……这些地方一漏,导出来的 Excel 就打不开。

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

【大数据分析 | 深度学习】在Hadoop上实现分布式深度学习

一、Submarine(Hadoop生态系统) (一)Submarine 介绍 (三)Submarine 属于 Hadoop 生态系统 (四)Submarine 官网版...

使用 ESP

针对该分类问题,我们使用了 Kaggle 手势识别数据集 中的一个开源数据集。原始数据集包括 10 个类别,我们只使用了其中 6 个。这些类别更容易识别,且日常生活中更有用,如...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

几种主要的神经网络

卷积神经网络的输入为二维的像素整阵列,输出为这个图片的属性,当网络训练学习后,所输入的图片或许经过稍微的变换,但卷积神经网络还是可以通过识别图片局部的特征而将整个图片识别出来。 :该层...

深入理解优化:如何利用 Gemini 3.1 的阶梯计费策略?企业级大规模调用实务完全指南|Duuu笔记

需深入理解Gemini 3.1阶梯计费与调用联动关系,通过识别阶梯区间、请求级Token预估截断、多模型路由调度、响应缓存去重、项目拆分配额绑定五种路径优化成本。 ☞☞☞AI 智能聊天, 问答助手,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。