gpt4 book ai didi

javascript - 使用服务器端处理从 DataTables 导出全部?

转载 作者:可可西里 更新时间:2023-11-01 13:25:44 24 4
gpt4 key购买 nike

我有一些表格使用 DataTables 服务器端处理显示在我的网站上。我希望能够“全部导出”并导出所有行,而不仅仅是显示的那些行。有 60000+ 行和 65+ 列,因此必须通过服务器端处理来完成。

我尝试了一些方法,但到目前为止没有任何效果。

我试过这个:

{ extend: 'excel',
text: 'Export Current Page',
exportOptions: {
modifier: {
page: 'current'
}
},
customize: function (xlsx)
{
var sheet = xlsx.xl.worksheets['sheet1.xml'];
$('row:first c', sheet).attr('s', '7');
}
}

它只导出页面上显示的行。

我已经试过了:

{
text: 'Export All to Excel',
action: function (e, dt, button, config)
{
dt.one('preXhr', function (e, s, data)
{
data.length = -1;
}).one('draw', function (e, settings, json, xhr)
{
var excelButtonConfig = $.fn.DataTable.ext.buttons.excelHtml5;
var addOptions = { exportOptions: { 'columns': ':all'} };

$.extend(true, excelButtonConfig, addOptions);
excelButtonConfig.action(e, dt, button, excelButtonConfig);
}).draw();
}
}

这会将整个表格的数据发送到屏幕,而不是使用分页并将整个数据集发送到 excel 文件。

我在 Google 和 SO 中四处搜索,但没有找到有效的解决方案。

我还应该提到,我想根据表格上设置的当前过滤器导出全部。这样最终用户将只获得他们正在搜索的那些行的导出。他们通常将其限制在 30k - 40k 行,仍然有 65+ 列。我(还)不允许删除/隐藏列。

编辑/更新

这是一个次要考虑因素:如果我不能从服务器的响应中导出所有内容,我可以在服务器上构建 Excel 文件吗?我的服务器没有安装 Excel,我仍然希望我的最终用户获取该文件。我确定我必须找到一种方法将 Excel 放到我的服务器上,但是我如何将任何创建的文件传输给最终用户,甚至比仅发送对整个数据集的响应并创建用户计算机上的 Excel 文件?

编辑

有人建议我尝试使用 jquery 的 $.ajax() 来让它工作。如果有人可以告诉我该怎么做,我会尝试使用第三个按钮。

我已经可以提取所有数据,使用用户添加的相同过滤器和排序,并通过一个按钮完成。上面的第二次尝试是这样做的,但将其发送到屏幕。我有 PHPExcel 和一个可以创建 Excel 工作表的文件。我如何将我在第二个按钮中获得的内容发送到另一个文件以创建 Excel 工作表?我认为使用 jquery 的 $.ajax() 可能有效,我只是不知道如何实现它。我知道我必须使用 $_POST,因为数据可能太大而无法使用 $_GET 将数据发送到 PHPExcel 文件。

我已经可以导出为 CSV,但我需要导出一些 CSV 没有的格式。这就是我不厌其烦地使用 PHPExcel 的原因。

编辑三

我正在尝试这个,虽然它还没有工作:

{
text: 'Export all to Excel II',
action: function (e, dt, button, config)
{
dt.one('preXhr', function (e, s, data)
{
data.length = -1;
}).one('export', function (e, settings, json, xhr)
{
var excelButtonConfig = $.fn.DataTable.ext.buttons.excelHtml5;
var addOptions = { exportOptions: { 'columns': ':all'} };

$.extend(true, excelButtonConfig, addOptions);
excelButtonConfig.action(e, dt, button, excelButtonConfig);
})
}
}

编辑 4

希望是最后一次编辑。

我知道我必须做三件事才能完成这项工作:

  1. 获取当前的排序和过滤
  2. 获取长度设置为-1的数据集
  3. 将此发送到 PHPExcel 文件以处理和创建 Excel 文件我可以像这样创建一个按钮:

    { text: '将所有数据导出到 Excel', 行动:

我只是不知道需要采取什么行动。

我在上面的第二次尝试提取了我需要的整个数据集,但将其发送到屏幕而不是我的 PHPExcel 文件 (ExportAllToExcel.php)。

我一直在努力解决这个问题,但还没有取得太大进展。我被告知我需要使用 $.ajax() 来执行此操作,我被告知我不需要使用它。我已经尝试过有和没有,但无法到达任何地方。

我也试过用这个没有效果:

$.fn.dataTable.ext.buttons.export =
{
className: 'buttons-alert',
"text": "Export All Test",
action: function (e, dt, node, config)
{
var SearchData = dt.search();
var OrderData = dt.order();
alert("Test Data for Searching: " + SearchData);
alert("Test Data for Ordering: " + OrderData);
}
};

最佳答案

首先在DataTable中添加如下代码

"dom": 'Blfrtip',
"buttons": [
{
"extend": 'excel',
"text": '<button class="btn"><i class="fa fa-file-excel-o" style="color: green;"></i> Excel</button>',
"titleAttr": 'Excel',
"action": newexportaction
},
],

然后在 $(document).ready() 函数中添加这个函数

function newexportaction(e, dt, button, config) {
var self = this;
var oldStart = dt.settings()[0]._iDisplayStart;
dt.one('preXhr', function (e, s, data) {
// Just this once, load all data from the server...
data.start = 0;
data.length = 2147483647;
dt.one('preDraw', function (e, settings) {
// Call the original action function
if (button[0].className.indexOf('buttons-copy') >= 0) {
$.fn.dataTable.ext.buttons.copyHtml5.action.call(self, e, dt, button, config);
} else if (button[0].className.indexOf('buttons-excel') >= 0) {
$.fn.dataTable.ext.buttons.excelHtml5.available(dt, config) ?
$.fn.dataTable.ext.buttons.excelHtml5.action.call(self, e, dt, button, config) :
$.fn.dataTable.ext.buttons.excelFlash.action.call(self, e, dt, button, config);
} else if (button[0].className.indexOf('buttons-csv') >= 0) {
$.fn.dataTable.ext.buttons.csvHtml5.available(dt, config) ?
$.fn.dataTable.ext.buttons.csvHtml5.action.call(self, e, dt, button, config) :
$.fn.dataTable.ext.buttons.csvFlash.action.call(self, e, dt, button, config);
} else if (button[0].className.indexOf('buttons-pdf') >= 0) {
$.fn.dataTable.ext.buttons.pdfHtml5.available(dt, config) ?
$.fn.dataTable.ext.buttons.pdfHtml5.action.call(self, e, dt, button, config) :
$.fn.dataTable.ext.buttons.pdfFlash.action.call(self, e, dt, button, config);
} else if (button[0].className.indexOf('buttons-print') >= 0) {
$.fn.dataTable.ext.buttons.print.action(e, dt, button, config);
}
dt.one('preXhr', function (e, s, data) {
// DataTables thinks the first item displayed is index 0, but we're not drawing that.
// Set the property to what it was before exporting.
settings._iDisplayStart = oldStart;
data.start = oldStart;
});
// Reload the grid with the original page. Otherwise, API functions like table.cell(this) don't work properly.
setTimeout(dt.ajax.reload, 0);
// Prevent rendering of the full data to the DOM
return false;
});
});
// Requery the server with the new one-time export settings
dt.ajax.reload();
}

关于javascript - 使用服务器端处理从 DataTables 导出全部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com