Chunk和excel Laravel

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

伙计们。 我需要这个代码的帮助。我需要下载一个excel,大约有550000条记录。所以我想知道我怎样才能使用雄辩与区块,跳过和限制,并得到使excel或做一些比这更好的。我开始编写一些代码,将excel保存在文件夹中,然后下载到zip中,但我无法将工作块化并获取

我在时间执行和内存限制方面有问题,但这不再是问题了

这是我的密码

$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。希望这对你有用。