您现在的位置是:休闲 >>正文
layui自带的导出功能显示null
休闲67296人已围观
简介表格里那列“部门名称”在页面上显示得好好的,点导出按钮下载Excel,打开一看,整列全是null。这不是个别现象,layui的table模块导出功能踩这个坑的人不少。 问题出在layui导出数据的取值 ...
表格里那列“部门名称”在页面上显示得好好的导出,点导出按钮下载Excel,显示打开一看,导出整列全是显示null。这不是导出个别现象,layui的显示table模块导出功能踩这个坑的人不少。
问题出在layui导出数据的导出取值逻辑上。它默认从表格渲染时用的显示data数组里拿字段值,而不是导出从当前DOM里抓文本。如果你的显示表格列用了templet自定义模板,页面上看到的导出是模板渲染后的结果,但原始data里那个字段可能压根不存在,显示或者是导出个嵌套对象里的属性。导出时它按field去取,显示取不到就给你一个null。导出
我遇到过最典型的情况是这样:后端返回的数据里,部门信息是嵌套的,像{ dept: { name: "技术部", id: 3}}。表格列配置写field: 'dept.name',layui的table在渲染时其实不认这种点号路径,页面能显示是因为用了templet: function(d){ return d.dept.name }。但导出的时候,导出模块内部用的是d[field]这种直接取值,d['dept.name']当然是undefined,最终序列化到Excel里就成了null。
还有一种情况更隐蔽。表格做了分页,当前页只渲染了10条数据,但用户想导出全部。layui的导出默认只导出当前页的data,如果你手动改了data或者用了where条件重新请求,导出模块拿到的还是旧的cache数据。字段对不上,null就来了。
解决办法得从根上改取值方式。最直接的是在导出配置里用exportFilter或者自己重写导出逻辑。layui 2.6之后的版本,table导出支持exportFilter回调,可以在这个回调里手动组装每一行的数据。比如:
table.exportFile('tableId', data, { type: 'xls', exportFilter: function(data) { data.forEach(function(row) { row.deptName = row.dept ? row.dept.name : ''; delete row.dept; }); return data; } }); 这样导出前把嵌套字段拍平,或者把模板里计算出来的值重新赋给一个平铺字段。注意exportFilter里拿到的data是引用,直接改就行,但别指望它自动帮你处理templet里的逻辑——那些逻辑得你自己再写一遍。
如果不想写回调,另一个办法是干脆不用layui自带的导出。自己写个table.on('toolbar')监听,拿到table.cache里的数据,用JSON.parse(JSON.stringify())深拷贝一份,然后手动映射字段,再调table.exportFile或者干脆用SheetJS。这样虽然多写几行,但可控性高得多。我现在的项目里基本都走这条路,因为layui自带的导出对复杂表头、合并单元格支持很弱,早晚要换。
还有个细节:如果表格列配置了hide: true隐藏列,导出时默认还是会导出隐藏列的数据。如果隐藏列的field在原始数据里不存在,同样会出null。要么在导出前把隐藏列删掉,要么在exportFilter里过滤。
说到底,layui的导出是个“半成品”。它假设你的数据是扁平的、字段名和field完全对应的。一旦用了模板、嵌套对象、分页异步加载,就得自己兜底。别指望它智能识别页面上显示的文字,它只认内存里的原始数据。
Tags:
上一篇:web30概念股龙头股
下一篇:应急响应培训
相关文章
如何收集竞争对手信息
休闲上个月,我注意到一个有意思的现象:一家同行公司的新产品发布会比原计划提前了整整两周。他们的官网更新了三条招聘信息,全部指向传感器方向。我花了一个下午翻他们近半年的专利公开记录,发现其中两项专利的核心技 ...
【休闲】
阅读更多转漏洞的转怎么写
休闲转漏洞的“转”,不是写出来的,是试出来的。我见过太多人抱着代码库啃三天,不如一个刚毕业的小孩拿Fuzzer乱砸半小时。你问怎么写?先把“写”这个念头丢掉。 真正的转漏洞,第一步是复现。不是看报告里那一 ...
【休闲】
阅读更多minecraft购买
休闲Minecraft的购买流程,比大多数人想象的要绕。官网首页那个绿色按钮写着“获取Minecraft”,点进去却是一堆版本选项——Java版、基岩版、Windows版,甚至还有教育版。我第一次买的时候 ...
【休闲】
阅读更多