我无法将多次搜索和选择的数据导出到CSV。我正在从有超过1000条记录的数据库中获取数据。例如,如果我在第一页选择了两行,然后我搜索其他记录,然后选择该记录并导出,但它只导出搜索到的记录,而不是来自第一页的记录。
$('#master tfoot th').each(function() {
var title = $(this).text();
$(this).html('<input type="text" placeholder="Search ' + title + '" />');
});
// DataTable
var master = $('#master').DataTable({
dom: 'Blfrtip',
buttons: [
'copy',
'csv',
'excel',
'pdf',
{
extend: 'print',
text: 'Print all (not just selected)',
exportOptions: {
modifier: {
selected: null
}
}
}
],
select: true
});
// Apply the search
master.columns().every(function() {
var that = this;
$('input', this.footer()).on('keyup change', function() {
if (that.search() !== this.value) {
that
.search(this.value)
.draw();
}
});
});
发布于 2019-06-08 16:07:47
在服务器端使用处理时,这是一个已知的限制。在这种情况下,datatable对象只知道当前绘图的数据。这就是为什么您只能导出表的可见/呈现内容的原因。
如果要从当前选定的所有行中导出数据,可以侦听数据表的select.dt
和deselect.dt
事件,并将所选内容的行数据存储在一个额外的数组中,您可以从中创建用于导出的csv数据。
有关这些事件的更多信息和示例,请参阅:
每当选择发生变化时,就会调度一个事件。我们可以侦听此select
-event,检查选择是否为row
类型,并将数据添加到数组或对象中。由于我们想要防止重复,我们应该为数据选择一个唯一的键(基于id或行的其他一些数据)。
根据您是如何实现数据表和处理的,您还必须注意deselect
-event。还可以在datatable中添加一些对分页的特殊处理,这样当您再次导航到其他页面时,这些行就会显示为选中状态。
let selectedRows = {}; // holds all the data of selected rows
let table = $('#example').DataTable({ /* settings */ });
table.on('select', function(e, dt, type, indexes) {
if ( type === 'row' ) {
let data = table.rows( indexes ).data();
for (let item of data) {
let key = item[0] + '_' + item[2] + '_' + item[2]; // an unique key, for example built from: eventName, firstName and lastName
if (!(key in selectedRows)) {
selectedRows[key] = item;
}
}
}
});
// Todo: handle deselect and maybe pagination...
然后,您可以使用javascript在浏览器中导出该数据。
let csvData = 'COLUMN_1,COLUMN_2,COLUMN_3, ..., COLUMN_N';
for (let row of selectedRows) {
csvData = csvData + '\n'
+ '"' + row.column_1 + '",'
+ '"' + row.column_2 + '",'
+ '"' + row.column_3 + '",'
/* ... */
+ '"' + row.column_N + '",';
// Create temporary download-element
let a = window.document.createElement('a');
a.href = window.URL.createObjectURL(new Blob([csvData], { type: 'text/csv;charset=utf-8;' }));
a.download = 'export.csv';
a.display = 'none';
// Append element to body and click it
document.body.appendChild(a);
a.click();
// Remove element from body
document.body.removeChild(a);
注意:如果您的数据包含包含双引号"
的字符串,则必须使用额外的双引号""
对其进行转义。
https://stackoverflow.com/questions/56506881
复制相似问题