将所有表导出到单个 csv
Posted
技术标签:
【中文标题】将所有表导出到单个 csv【英文标题】:export all tables to single csv 【发布时间】:2021-12-02 08:36:08 【问题描述】:我使用 datatables.net,我的一些页面有多个表。我不知道如何遍历每个表,将数据保存到变量中,以便在单击导出按钮时将其作为单个 csv 推出。
有些表有不同的标题,这都很好。我只想将整个表中的所有 th 和 td 值输出到单个 csv。如果数据表不以某种迂回的方式支持这一点,那么如果它是 jquery 或 javascript 就可以了。
提前致谢
【问题讨论】:
你想用javascript做这个吗? 请展示您尝试过的内容,并明确说明您的挑战所在。请在此处发布为实际代码。 这样的 CSV 文件会是什么样子?一个 CSV 文件通常只有一个标题行,并且所有数据行都具有与该标题行相同数量的字段。如果您有多个表格,您也有多个不同的标题行 - 以及可能具有不同列数的表格。 【参考方案1】:试试这个方法
<table id="example1" class="table" style="width:100%">
</table>
<table id="example2" class="table" style="width:100%">
</table>
JS:
var table = $('#example1').DataTable();
var data = table.buttons.exportData();
// Do something with the 'data' variable
buttons.exportData()
【讨论】:
【参考方案2】:这对我有用。谢谢。
$( "#exportalltocsv" ).on( "click", function(e)
e.preventDefault();
let csvstring = "";
$('.dataTable').each( function ()
var columns = [];
$(this).DataTable().columns().eq(0).each( function ( index )
var column = this.column( index ).header();
columns.push($(column).html());
);
csvstring += columns.map(th => '"' + th.replace('"', '\"') + '"').toString() + "\n";
$(this).DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop )
csvstring += this.data().map(value => '"' + value.replace('"', '\"') + '"').toString() + "\n";
);
csvstring += "\n\n";
);
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvstring);
hiddenElement.target = '_blank';
hiddenElement.download = '<?=$pagetitle.date(' Y-m-d H-i-s')?>.csv';
hiddenElement.click();
);
【讨论】:
一些注意事项,以防它们帮助未来的访问者获得此答案:(1) 此答案似乎基于此其他答案的代码:Export and append object to csv。 (2) 最终结果不是有效的 CSV 文件 - 但在这种情况下,也许 OP 可以接受。 (3) 此处的代码无法正确处理双引号:value.replace('"', '\"')
。这会将"
替换为"
。它也只会替换给定字符串中"
的first 出现,因为它正在替换文字,而不是使用正则表达式。代码需要使用value.replaceAll('"', '\\"')
。 (4) 由于该方法不使用 CSV 库,因此可能存在其他方式导致导出的数据不是有效的 CSV 数据。以上是关于将所有表导出到单个 csv的主要内容,如果未能解决你的问题,请参考以下文章
使用fputcsv导出到csv时是否可以使标题文本变为粗体?