Laravel-admin 自定義csv匯出,支援原有匯出csv的所有功能,匯出所有資料使用分頁查詢處理

風吹過有夏天的味道發表於2021-12-17

新建基礎匯出類

<?php


namespace App\Admin\Extensions\Exports;
use Encore\Admin\Grid;
use Encore\Admin\Grid\Exporters\AbstractExporter;
use Illuminate\Database\Eloquent\Model;

class BaseExport extends AbstractExporter
{
    public function __construct(Grid $grid = null)
    {
        parent::__construct($grid);
    }

    /**
     * @var string
     */
    protected $fileName;

    /**
     * @var array
     */
    protected $headings = [];

    /**
     * @var array
     */
    protected $columns = ['*'];

    /**
     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
     */
    public function query()
    {
        if (!empty($this->columns)) {
            return $this->getQuery()->select($this->columns);
        }

        return $this->getQuery();
    }

    public function export()
    {
        $this->csv($this->fileName,$this->headings,$this->query());
    }

    public function map(Model $model){
        return [];
    }

    /**
     * 匯出csv
     *
     * @param String $sFileName
     * @param array $aTitle
     * @param $oQuery
     * @author zjh
     */
    protected function csv($sFileName,Array $aTitle, $oQuery)
    {
        // 設定過期時間
        set_time_limit(0);
        //處理需要匯出的資料
        //設定好告訴瀏覽器要下載excel檔案的headers
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment; filename="'. $sFileName .'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        $fp = fopen('php://output', 'a');//開啟output流
        fwrite($fp, "\xEF\xBB\xBF"); // 寫入bom 頭 可識別 utf8
        fputcsv($fp, $aTitle);//將資料格式化為CSV格式並寫入到output流中

        $perSize = 10000;//每次查詢的條數

        $oQuery->chunkById($perSize,function ($collection) use($fp){
            foreach($collection as $obj) {
                $rowData = $this->map($obj); //返回 array
                fputcsv($fp, $rowData);
            }
            unset($oCollection);//釋放變數的記憶體
            //重新整理輸出緩衝到瀏覽器
            if (ob_get_level() > 0) {
                ob_flush();
            }
        });

        fclose($fp);
        exit();
    }


}

建立匯出類

<?php
namespace App\Admin\Extensions\Exports;

use Illuminate\Database\Eloquent\Model;

class UserExport extends BaseExport
{

    /**
     * 匯出檔名
     * @var string
     */
    public $fileName = 'test.csv';

    /**
     * 匯出標題
     * @var string[]
     */
    public $headings = [
        'ID','使用者名稱','建立時間','使用者角色'
    ];

    /**
     * 匯出查詢欄位 預設 *
     * @var string[]
     */
    public $columns = [
        'id', 'username', 'created_at', 'role_id'
    ];

    /**
     * 匯出設定對映
     * @param Model $model
     * @return array
     */
    public function map(Model $model)
    {
        return [
            $model->id,
            $model->username,
            $model->created_at,
            data_get($model,'role.name','')
        ];
    }

在laravel-admin 控制器中 使用

  protected function grid()
    {
        $grid = new Grid(new Application);

         $grid->exporter(new UserExport());
    }

已釋出成 composer summer-wind 包 ,歡迎下載使用

本作品採用《CC 協議》,轉載必須註明作者和本文連結
喜歡的話就點個贊吧!

相關文章