在 laravel excel 中自动导出

Export automatically in laravel excel

我有疑问,我不知道如何发送参数,以便我导出的收集函数生成一个包含该数据的 excel。 我通过我的一个控制器的方法生成此查询

控制器是GenerateNumbersController.php,方法是validateNumberBD

我生成的查询如下:

$searchOrCreate = Phone::insertIgnore($consultArray);

if ($searchOrCreate) {
    $phones = Phone::select('PHONES.PHONE','AREACODES.CODE')
    ->join('AREACODES','AREACODES.AREACODES_ID','=','PHONES.AREACODES_ID')
    ->where('DATE',$searchOrCreate)
    ->get();
}

该查询生成了一个数据集合,我需要将其发送以自动导出。

这是我的问题开始的地方,因为我不知道如何将该变量发送到 PhonesExport class,这是生成导出到 Exce

的 class

我尝试在 PhonesExport class 中创建一个名为 data ($ value) 的新函数,如下所示:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use App\Http\Controllers;

class PhonesExport implements FromCollection
{   
    public $data;

    /**
     * @return \Illuminate\Support\Collection
     */
    public function collection()
    {
        global $data;       
        return $data;
    }

    public function data($dato)
    {
        global $data;
        $data = $dato;
    }
}

并通过第一个代码的方法尝试生成那个class的实例,然后通过相同的参数发送它如下。

$searchOrCreate = Phone::insertIgnore($consultArray);

if ($searchOrCreate) {
    $phones = Phone::select('PHONES.PHONE','AREACODES.CODE')
    ->join('AREACODES','AREACODES.AREACODES_ID','=','PHONES.AREACODES_ID')
    ->where('DATE',$searchOrCreate)
    ->get();    

    $excel = new PhonesExport();
    $excel->data($phones );

    \Excel::download($excel,'phones.xlsx');
}

但是执行时它对我没有产生任何影响。

选项 1:使用依赖注入。

$searchOrCreate = Phone::insertIgnore($consultArray);
if ($searchOrCreate) {
    $phones = Phone::select('PHONES.PHONE','AREACODES.CODE')
    ->join('AREACODES','AREACODES.AREACODES_ID','=','PHONES.AREACODES_ID')
    ->where('DATE',$searchOrCreate)
    ->get();    

    $excel = new PhonesExport($phones);

    \Excel::download($excel,'phones.xlsx');
}
namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Illuminate\Support\Collection;

class PhonesExport implements FromCollection
{
    protected $phones;

    public function __construct($phones)
    {
       $this->phones = $phones;
    }

    /**
     * @return Collection
     */
    public function collection()
    {
       return $this->phones;
    }
}

选项 2:将查询移至导出器 class。

$searchOrCreate = Phone::insertIgnore($consultArray);
if ($searchOrCreate) {    
    $excel = new PhonesExport($searchOrCreate);

    \Excel::download($excel,'phones.xlsx');
}
namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Illuminate\Support\Collection;
use App\Phone;

class PhonesExport implements FromCollection
{
    protected $date;

    public function __construct($date)
    {
       $this->date = $date;
    }

    /**
     * @return Collection
     */
    public function collection()
    {
       return Phone::select('PHONES.PHONE','AREACODES.CODE')
       ->join('AREACODES','AREACODES.AREACODES_ID','=','PHONES.AREACODES_ID')
       ->where('DATE', $this->date)
       ->get();
    }
}

选项 3:使用 readfile 强制下载。

不调用 \Excel::download(...),而是调用 \Excel::store(...),然后 return 下载文件。

// \Excel::download($excel,'phones.xlsx');
\Excel::store($excel, 'tmp.xlsx');
$filename = 'phones.xlsx';
$filepath = storage_path('app/tmp.xlsx');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));
flush(); // Flush system output buffer
readfile($filepath);
exit;
namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Illuminate\Support\Collection;
use App\Phone;

class PhonesExport implements FromCollection
{
    protected $date;

    public function __construct($date)
    {
       $this->date = $date;
    }

    /**
     * @return Collection
     */
    public function collection()
    {
       return Phone::select('PHONES.PHONE','AREACODES.CODE')
       ->join('AREACODES','AREACODES.AREACODES_ID','=','PHONES.AREACODES_ID')
       ->where('DATE', $this->date)
       ->get();
    }
}