Laravel DataTables大型导出

时间:2017-12-20 15:08:02

标签: php laravel datatables laravel-excel

我接管了一个使用Yajra DataTables包的Laravel项目。该表呈现正常,我能够添加一个在大多数情况下都能正常工作的CSV / Excel导出按钮。

我遇到的问题是我们的应用程序有时会输出10k记录,当我尝试将完整数据集导出为CSV时,它会在浏览器中出现空白页面时出现500内部服务器错误(空响应) )过了一会儿。

我已经尝试更新所有Laravel和Laravel DataTables软件包,并尝试从各种论坛帖子中搜索代码,尝试使用可能会破坏处理的逻辑来覆盖软件包的buildExcelFile(),但我总是这样做结果

原始方法(source):

protected function buildExcelFile()
{
    /** @var \Maatwebsite\Excel\Excel $excel */
    $excel = app('excel');

    return $excel->create($this->getFilename(), function (LaravelExcelWriter $excel) {
        $excel->sheet('exported-data', function (LaravelExcelWorksheet $sheet) {
            $sheet->fromArray($this->getDataForExport());
        });
    });
}

源代码使用另一个名为laravel-excel的软件包,但我无法弄清楚如何更新逻辑,以便它以较小的块进行处理并实际工作。

任何人都可以帮助找出使用Yajra Laravel DataTables包将大型结果集导出为CSV的逻辑吗?

2 个答案:

答案 0 :(得分:2)

我也遇到了这个问题,我使用以下步骤分块修复了该问题: 我创建了一个名为override的类,该类具有一个覆盖默认的buildExcelFile()方法的方法,并通过该类扩展了我的所有数据表。这是我的替代类的代码

namespace App\DataTables;
use Maatwebsite\Excel\Classes\LaravelExcelWorksheet;
use Maatwebsite\Excel\Writers\LaravelExcelWriter;
use Yajra\Datatables\Services\DataTable;
class Override extends DataTable
{
protected function buildExcelFile()
{
/** @var \Maatwebsite\Excel\Excel $excel */
$excel = app('excel');

return $excel->create($this->getFilename(), function (LaravelExcelWriter    $excel) {
    $excel->sheet('exported-data', function (LaravelExcelWorksheet $sheet) {
        $this->query()->chunk(100,function($modelInstance) use($sheet) {
        $modelAsArray = $modelInstance->toArray();
        foreach($modelAsArray as $model)
        $sheet->appendRow($model);
    });
  });
});}public function query()
{
    // this method is overwritten in my datatable class , and it's that query result that is chunked method buildExcelFile() above
 }
}

然后我的Datatable类看起来更像这样

<?php

namespace App\DataTables;
use ...
class AssignDataTable extends Override
{
...

希望对您有帮助。

答案 1 :(得分:1)

如果任何人使用Laravel Excel 3.0+,则上层解决方案将不起作用。因此您应该使用“ Queued Export”覆盖buildExcelFile()。

或者我也通过使用分块来做其他事情,但是通过创建特征并使用CSV来完成我的工作,这是我的example