我接管了一个使用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的逻辑吗?
答案 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。