DataTables Buttons问题:CSV导出无法获取fnRowCallback设置的单元格值
解决DataTables CSV导出无法获取fnRowCallback设置值的问题
我之前也碰到过一模一样的情况——用fnRowCallback改了单元格显示内容,结果导出CSV时还是拿到原始数据,折腾了好一会儿才摸清楚问题根源。下面给你两种可行的解决方案,按需选择:
方案一:改用columns.render(推荐,符合DataTables设计逻辑)
fnRowCallback只是修改了页面上的DOM元素,并没有更新DataTables内部存储的数据集,所以导出时默认还是读取原始数据源的值。正确的做法是把渲染逻辑移到列定义的render函数里,同时利用orthogonal参数区分显示和导出场景:
修改动态列定义:
把你原来在fnRowCallback里处理单元格值的逻辑,放到对应列的render函数中,并指定不同type返回对应的值:var Columns = [ { "data": "Name" }, { "data": "EmployeeNum", "sClass": "text-center", "render": function(data, type, row) { // type参数会区分场景:'display'是页面显示,'export'是导出,'sort'是排序等 if (type === 'display' || type === 'export') { // 这里写你原来在fnRowCallback里设置的单元格值逻辑 // 比如:return data + " (已验证)"; return data; // 替换成你的实际处理逻辑 } // 其他场景(比如排序、筛选)返回原始数据 return data; } } // 其他列同理 ];配置导出按钮的
orthogonal选项:
在CSV按钮的exportOptions里指定使用export类型的正交数据(或者直接用display,看你render里的设置):buttons: [ 'selectNone', 'selectAll', { extend: 'csv', title: 'Data export', exportOptions: { columns: colArr, rows: { selected: true }, orthogonal: 'export' // 指定用导出场景的渲染值 } } ]
方案二:直接从DOM读取渲染后的值(适合不想改列定义的场景)
如果不想调整列定义,也可以让导出时直接读取页面上DOM元素的内容,通过format.body实现:
buttons: [ 'selectNone', 'selectAll', { extend: 'csv', title: 'Data export', exportOptions: { columns: colArr, rows: { selected: true }, format: { body: function(data, row, column, node) { // 直接从DOM节点获取渲染后的文本内容 return $(node).text().trim(); } } } } ]
为什么你之前用orthogonal没生效?
因为orthogonal是基于DataTables内部存储的不同类型数据来工作的,而fnRowCallback只是修改了DOM,没有更新这些内部存储的正交数据。只有通过render函数定义的不同type值,才会被DataTables存储起来,供导出时调用。
内容的提问来源于stack exchange,提问作者Rudolph Opperman
相关产品推荐
相关产品推荐

