Chunk和excel Laravel
伙计们。 我需要这个代码的帮助。我需要下载一个excel,大约有550000条记录。所以我想知道我怎样才能使用雄辩与区块,跳过和限制,并得到使excel或做一些比这更好的。我开始编写一些代码,将excel保存在文件夹中,然后下载到zip中,但我无法将工作块化并获取 我在时间执行和内存限制方面有问题,但这不再是问题了 这是我的密码Chunk和excel Laravel,excel,laravel,eloquent,Excel,Laravel,Eloquent,伙计们。 我需要这个代码的帮助。我需要下载一个excel,大约有550000条记录。所以我想知道我怎样才能使用雄辩与区块,跳过和限制,并得到使excel或做一些比这更好的。我开始编写一些代码,将excel保存在文件夹中,然后下载到zip中,但我无法将工作块化并获取 我在时间执行和内存限制方面有问题,但这不再是问题了 这是我的密码 $x=1; for ($i=0; $i<=550000; $i=$i+15000) { $persona
$x=1;
for ($i=0; $i<=550000; $i=$i+15000) {
$personas="";
$personas = DB::table("cat_personas as c")->select("c.*","s.seccion","ca.casilla")
->leftJoin("cat_casillas as ca","c.cat_casilla_id","=","ca.id")
->join("cat_seccion as s","c.cat_seccion_id","=","s.id")
->where($filtros)
->whereRaw("c.id NOT IN ( SELECT cruzado FROM registro_persona )")
->whereRaw($whereCadena)
->orderby('c.consecutivo')
->orderby('c.apellido_paterno')
->orderby('c.apellido_materno')
->orderby('c.nombre')
->orderby('s.seccion')
->orderby('ca.casilla')
->skip($i)->limit(15000);
//$personas=$personas->get();
dd($personas->count());
if($personas->count()>0){
$spreadsheet = new Spreadsheet();
$r=1;
$sheet = $spreadsheet->getActiveSheet()
->setCellValue('A'.$r, '#')
->setCellValue('B'.$r, 'NOMBRE')
->setCellValue('C'.$r, 'APELLIDO PATERNO')
->setCellValue('D'.$r, 'APELLIDO MATERNO')
->setCellValue('E'.$r, 'SECCION')
->setCellValue('F'.$r, 'CASILLA')
->setCellValue('G'.$r, 'CONSECUTIVO');
$r++;
$personas->chunk(5000, function($personas) use (&$spreadsheet,&$r,&$sheet) {
$c=1;
//dd($personas->count());
foreach ($personas as $key) {
$sheet = $spreadsheet->getActiveSheet()
->setCellValue('A'.$r, $c)
->setCellValue('B'.$r, $key->nombre)
->setCellValue('C'.$r, $key->apellido_paterno)
->set`enter code here`CellValue('D'.$r, $key->apellido_materno)
->setCellValue('E'.$r, $key->seccion)
->setCellValue('F'.$r, $key->casilla)
->setCellValue('G'.$r, $key->consecutivo);
$r++;
$c++;
}
});
$writer = new Xlsx($spreadsheet);
//header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
//header('Content-Disposition: attachment; filename="personas.xlsx"');
$writer->save($path."/personas$x.xlsx");
$x++;
}
}
您可以这样使用chunk
$personas = DB::table("cat_personas as c")->select("c.*","s.seccion","ca.casilla")
->leftJoin("cat_casillas as ca","c.cat_casilla_id","=","ca.id")
->join("cat_seccion as s","c.cat_seccion_id","=","s.id")
->where($filtros)
->whereRaw("c.id NOT IN ( SELECT cruzado FROM registro_persona )")
->whereRaw($whereCadena)
->orderby('c.consecutivo')
->orderby('c.apellido_paterno')
->orderby('c.apellido_materno')
->orderby('c.nombre')
->orderby('s.seccion')
->orderby('ca.casilla');
$spreadsheet = new Spreadsheet();
$r = 1;
$sheet = $spreadsheet->getActiveSheet()
->setCellValue('A'.$r, '#')
->setCellValue('B'.$r, 'NOMBRE')
->setCellValue('C'.$r, 'APELLIDO PATERNO')
->setCellValue('D'.$r, 'APELLIDO MATERNO')
->setCellValue('E'.$r, 'SECCION')
->setCellValue('F'.$r, 'CASILLA')
->setCellValue('G'.$r, 'CONSECUTIVO');
$r++;
$c = 1;
$personas->chunk(500, function($personae) use ($spreadsheet, $r, $c) {
foreach ($personae as $persona) {
$spreadsheet->getActiveSheet()
->setCellValue('A'.$r, $c)
->setCellValue('B'.$r, $persona->nombre)
->setCellValue('C'.$r, $persona->apellido_paterno)
->setCellValue('D'.$r, $persona->apellido_materno)
->setCellValue('E'.$r, $persona->seccion)
->setCellValue('F'.$r, $persona->casilla)
->setCellValue('G'.$r, $persona->consecutivo);
$r++;
$c++;
}
});
$writer = new Xlsx($spreadsheet);
$writer->save($path . "/personas.xlsx");
电子表格的总大小可能有问题,但如果有,这应该是找到解决方案的良好开端
PS-这未经测试。laravel已构建int chunk support。您使用什么软件包创建电子表格?你面临的错误是什么?PS、XLSX文件实际上已经压缩。如果将.xlsx文件重命名为.zip,则可以使用use PhpOffice\PhpSpreadsheet\Spreadsheet打开它并查看.Im中的文件;V1.9。问题是chunk与get-in-eloquent不起作用。请定义您的$spreadsheet和$writer save out forloop@SergioFimbres,您是对的,get不适用于chunk。如果没有get,if$personas->count将返回0?Thx那么多。但是我在调用undefined method Illumb\Database\Query\Builder::lazy时出错了。你知道为什么吗?你使用的是什么版本的Laravel?我使用的是Laravel 7,真幸运。Lavel 8中引入了lazy。让我重新思考chunk方法。@SergioFimbres-我刚刚更新回使用chunk。希望这对你有用。