通过服务器端处理从数据表中导出所有内容?

2024-01-08

我有使用 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 文件?

EDIT

建议我尝试 jquery 的$.ajax()让它发挥作用。如果有人能给我一个如何做到这一点的想法,我会尝试第三个按钮。

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

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

EDIT III

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

{
    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);
        })
    }
}

EDIT 4

希望最后一次编辑。

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

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

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

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

我上面的第二次尝试提取了我需要的整个数据集,但将其发送到屏幕而不是我的 PHPExcel 文件(导出全部到Excel.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();
     }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过服务器端处理从数据表中导出所有内容? 的相关文章

随机推荐

  • R dplyr left join - 多个返回值和新行:如何仅询问第一个匹配项?

    假设我在单独的表格中列出了郊区名称 犯罪率及其议会名称 我知道 left join table1 table2 by Suburb 将返回由于理事会的多个匹配而新添加的行的表 问题是郊区 3 和郊区 4 重叠为两个议会 有没有办法让左连接只
  • jQuery 是否删除 AJAX 请求返回的脚本标签?

    我正在基于 jQuery 的 JavaScript 代码中执行 AJAX 调用 响应包含一个
  • 我将我的应用程序本地化到日本,但我看不到它

    最近 我使用 iTunes Connect 在国际上上传了我的应用程序 包括日本 法国 中国等 我可以在法国 Apple 的 App Store 中看到我的应用程序的法语版本 但是 我在日本和中国的 App Store 中只显示英文版本 我
  • 所有这些 Reactive Observable 扩展之间的实际区别是什么?

    给定一个BehaviorSubject 在其上调用所有这些不同的函数之间的实际区别是什么 First Last 最新值 最近值 下一个值 Single Take 1 假设我理解正确 给定BehaviorSubject 他们都应该做同样的事情
  • 每个分支基于作业的安全性 - Jenkins 多分支管道

    我有一个用于构建工件的 Jenkins 多分支管道 并且有用于master dev etc 我想在每个分支的基础上启用基于项目的安全性 即只允许开发人员运行 dev构建的分支作业而不是任何其他作业 因为这样做会产生不良影响 我知道有基于项目
  • Linux IOMMU 页表

    我一直在读关于IOMMU https en wikipedia org wiki Input E2 80 93output memory management unitLinux 中的支持 并对 IOMMU 中的页表有一些疑问 IOMMU
  • Oracle SQL Developer 在哪里存储连接?

    我的应用程序无法连接到 Oracle Database 11g Express Edition 我在此版本中创建了一个测试数据库 我可以使用 Oracle SQL Developer 很好地连接到数据库 创建表 视图等 但是 我很难通过我的
  • 散景热图的使用

    我有一系列带有时间戳的某些事件 并且想要创建一个热图 x 轴应代表日期 例如 2016 02 03 y 轴应代表发生的时间 例如13 如果 13 32 颜色应取决于发生事件的计数 我的数据 作为 pandas 数据框z head date
  • 为什么 java.util.concurrent.ArrayBlockingQueue 在调用await() 时使用“while”循环而不是“if”?

    我一直在玩我自己的版本 使用 if 一切似乎都工作正常 当然 如果使用 signalAll 而不是 signal 这会严重崩溃 但如果一次只通知一个线程 这怎么会出错呢 他们的代码here http fuseyism com classpa
  • 将文本文件中的数字列表转换为整数

    我有一个在文本文件中从左到右读取的数字列表 我试图让 Python 将它们作为数字列表读取 以便我最终可以将它们绘制成图表 我一直在尝试各种字符串 pickle 和字节到字符串代码 但不可避免地会出现错误 数字的例子 20494 20461
  • 使用 pymongo 在 mongodb 上插入 $currentDate

    我需要测试服务器 mongodb 的准确性 我正在尝试插入一系列数据 花点时间将其发送到数据库以了解其何时插入 我正在尝试这个 usr bin python from pymongo import Connection from datet
  • 日历事件的可视化。以最大宽度布局事件的算法

    我需要你的算法帮助 它将在客户端使用 JavaScript 开发 但这并不重要 我最感兴趣的是算法本身 布局日历事件 以便每个事件框都有最大宽度 请看下图 Y 轴是时间 因此 如果 测试事件 从中午开始 例如 并且没有其他内容与其相交 则它
  • 如何在不使用 sudo 的情况下安装 virtualenv?

    I have easy install and pip 我的错误很多Linux 薄荷 12 我刚刚重新安装了它 我想再次从头开始安装所有内容 This https stackoverflow com questions 9340637 is
  • 获取 URL 中传递的变量 Laravel

    可能是一个基本问题 但我似乎无法理解 我想将我的 url 中的变量抓取到我的控制器 索引视图 foreach paymentInfos as p tr td a href p gt order id a td td p gt lastnam
  • CSS-Grid:如果侧边栏为空,则拉伸主网格

    我对包含侧边栏的简单网格布局有一些样式问题 aside 还有一些main内容
  • navigatorKey.currentContext 始终为 Null

    我想在收到 FCM 后台消息时切换到屏幕 但对于这个context是必需的 但我里面绝对没有FirebaseBackgroundMessageHandler所以在网上搜索后我发现我可以从NavigatorKey所以我创建了这个全局变量 fi
  • Python 圆周率计算?

    我是 python 初学者 我想计算 pi 我尝试使用 Chudnovsky 算法 因为我听说它比其他算法更快 这是我的代码 from math import factorial from decimal import Decimal ge
  • 使用 Pip 将软件包安装到 Anaconda 环境

    康达4 2 13 MacOS X 10 12 1 我正在尝试从安装包pip到使用 anaconda 创建的新环境 虚拟 在 Anaconda 文档中 http conda pydata org docs using pkgs html in
  • AudioOutputUnitStart 非常慢

    我有一个播放单声道音频事件的代码 各种频率的短蜂鸣声 我创建一个 AudioOutputUnit 并在需要播放音频时停止它 我开始它 当我玩到规定的时间后 我就会停止它 听起来很简单 然而 在我的 iPhone 4S 使用 iOS 5 1
  • 通过服务器端处理从数据表中导出所有内容?

    我有使用 DataTables 服务器端处理的表格在我的网站上显示 我希望能够 导出全部 并导出所有行 而不仅仅是显示的那些行 有 60000 行和 65 列 因此必须通过服务器端处理来完成 我尝试了一些方法 但到目前为止没有任何效果 我已