透過MAATWEBSITE/LARAVEL-EXCEL匯出資料-EXPORT

透過MAATWEBSITE/LARAVEL-EXCEL匯出資料-EXPORT

上次簡單的介紹過如何透過MAATWEBSITE/LARAVEL-EXCEL匯入資料-IMPORT。這次剛好專案做到輸出資料,這邊就順便筆記一下。由於maatwebsite/excel目前已經更新到3.0版了,但是因為專案因素,這邊的操作還是使用2.1版,可參閱文件

相關安裝及初始設定請參考上篇文章

在匯出文件前要先準備一個存放資料的陣列。在預設的情況下,套件會直接抓取陣列的key值當做第一行(Header column),如果在規劃上不需要則可以在設定內把它取消,在config\excel內找到

 'generate_heading_by_indices' => true,//預設是true,若要取消可改成false

在新版(3.0),匯入的資料可以是Collection or Model在使用上會十分方便。但是在舊版則只能使用array匯入,所以在取出資料之前記得把資料轉成array,目前專案式使用Fractal的Transformer來把collection轉成想要輸出的array格式(包含key名稱)。如以下:這邊不深究fractal的設定及使用方式,只提供一個collection轉換成array的方法,fractal有機會再來聊聊。

public function excelDownload($request, DataRepository $dataRepo, ExcelDownload $download)
{
    $inputs = $request->all();//取的所有表單資料
    $data = fractal(
        $dataRepo->search($inputs)->get(),//透過表單搜尋取得資料
        new \App\Transformer\ExcelDownloadTransfoormer);
        
    $download->download($data->toArray());//轉換成陣列
}

接著就是excel的輸出

//App\ExcelDownload.php
<?php

namespace App;

use Excel;

class ExcelDownload
{
    public function download(array $data)
    {
        $data = $data['data'];//因為實際上transformer會包一層data,先取出。

        Excel::create('FileName', function ($excel) use ($data) {//第一參數是檔案名稱
            $excel->sheet('SheetName', function ($sheet) use ($data) {//第一個參數是sheet名稱
                $sheet->fromArray($data);//可以簡單用fromArray這個函式傳資料進去。
            });
        })->export('xls');//輸出格式,也可選擇csv,若是要輸出成pdf則需要另外安裝套件
//可參考https://laravel-excel.maatwebsite.nl/2.1/export/export.html#export-to-pdf
    }
}

fromArray共有五個參數依序是$source, $nullValue, $startCell, $strictNullComparison, $headingGeneration

  • source:要輸出的array

  • nullValue:array資料內null的呈現方式,預設null

  • startCell :資料起始位置,預設A1

  • strictNullComparison : 預設情況下0會視為空白,若要顯示0則需改成false,預設true

  • headingGeneration:表頭是否自動產生。預設為true

以上是簡單的輸出方式 。

另外maatwebsite/excel提供了一些調整excel格式的方法,如

//設定title
$excel->setTitle('Our new awesome title');
//設定特定的row, 並設定其參數。
$sheet->row(1, function($row) {
    // call cell manipulation methods
    $row->setBackground('#000000');
});
//設定sheetStyle
$sheet->setStyle(array(
    'font' => array(
        'name'      =>  'Calibri',
        'size'      =>  15,
        'bold'      =>  true
    )
));
// Set width for multiple cells
$sheet->setWidth(array(
    'A'     =>  5,
    'B'     =>  10
));

以上大概是常用到的內容,若想知道更多詳細的資訊還是建議參考官網為主喔!