關於laravel5的excel包maatwebsite/excel的使用筆記_v1.0_byKL

線上猛如虎發表於2019-02-16

關於laravel5的excel包maatwebsite/excel的使用筆記

關於安裝

官網已經很詳細了,不再描述.
http://www.maatwebsite.nl/laravel-excel/docs/getting-started

關於匯入

匯入的話只有幾個小地方需要注意:

  1. 匯入的時候會有產生一些null的cells

    $reader->ignoreEmpty();
    //or
    //在迴圈遍歷匯入的資料的時候主動忽略null
  2. 關於中文或者亂碼問題

    Excel::load(`filename.csv`, function($reader) {
    
    }, `UTF-8`);
    或者在配置檔案 excel.php(在安裝這個模組的文件有介紹怎麼生成這個檔案)
    
    
     /*
            |--------------------------------------------------------------------------
            | Sheet heading conversion
            |--------------------------------------------------------------------------
            |
            | Convert headings to ASCII
            | Note: only applies to `heading` settings `true` && `slugged`
            |
            */
    
            `to_ascii`                => false, //主要修復一些亂碼
    
            /*
            |--------------------------------------------------------------------------
            | Import encoding
            |--------------------------------------------------------------------------
            */
    
            `encoding`                => array(
    
                `input`  => `UTF-8`, //中文識別
                `output` => `UTF-8`
    
            ),
  3. 匯入的時候只讀取第一個sheets

            $reader = Excel::load($file);
    
            $postDataFilter = [];
    
            $excelArray = $reader->first()->toArray();
    多個表的話
    
    Excel::batch(`app/storage/uploads`, function($sheets, $file) {
            
        $sheets->each(function($sheet) {//這裡的$sheet變數就是sheet物件了,excel裡的每一個sheet
    
        });
    
    });

關於匯出

需要先關注一下匯出的時候maatwebsite/excel是使用什麼資料的

$result2 = array( //這個代表sheet本身
    array(`data1`, `data2`), //這裡代表一行 row,裡面的資料就是橫向分佈的每一個row的cell
    array(`data3`, `data4`) //這裡是第二行row
);

這裡需要注意的是多個sheet的話,不能直接在陣列裡面寫,要建立多個 $excel->sheet

上面是關於匯出陣列的構成結構,下面是關於匯出的函式需要注意的地方,至於如何完整使用,官方文件說得還算是很清晰的

public function excelExport(){
//這裡需要使用use來傳遞變數給內部閉包,這裡假設$result2是一個要轉換成excel的陣列資料
    Excel::create(`testexcel`, function ($excel) use ($result2, $apiHost) {
            $excel->sheet(`Sheetname`, function ($sheet) use ($result2, $apiHost){

                // Sheet manipulation
                //需要注意的地方1
                $sheet->fromArray($result2, null, `A1`, false, false);   
                //需要注意的地方2                 
                foreach ($result2 as $index=>$item) {
                    if($index == 0 ){ //排除標題row
                        continue;
                    }
                    //J2:J代表excel的讀取多個cell的寫法,寫過excel程式設計的不陌生
                    $sheet->getHyperlink(`J2:J` . (count($result2) + 1))->setUrl($item[`url`]);
                }
            });
        })->export(`xlsx`);
}
  1. 地方1:

    這裡是將陣列轉變為sheet的命令,`->fromArray($source, $nullValue, $startCell, $strictNullComparison, $headingGeneration)`
    
    這裡需要關注最後一個引數:`$headingGeneration`,預設是開啟的,預設會將陣列的keys匯出,並且在第一行開始,但是一般我們第一行是用做標題的,所以需要關閉,這是例子寫法:
    
    $sheet->fromArray($data, null, `A1`, false, false);
    那麼我們做標題時候還需要手動寫入一個標題的row,例如這裡是以$result2為例
    
    $tmpHeader = [
                `id`,
                `名稱`,
                `標籤`,
                //......
            ];
    $result2[] = $tmpHeader;//將匯出陣列的第一個元素作為標題,不過需要注意,在構建這個匯出陣列的時候,真正的資料要從索引1開始,因為0已經是標題了
    
  2. 地方2:

    這裡是將一個cell設定為可點選的網頁連結的
    
    這是標準例子
    $sheet->getCell(`E26`) //獲得cell
        ->getHyperlink() //獲取Hyperlink物件
        ->setUrl(`http://examle.com/uploads/cv/` . $cellValue) //設定url
        ->setTooltip(`Click here to access file`); //這裡可以不管,只是提示資訊
    這裡是phpexcel的方法,其實laravel-excel是封裝在phpexcel上面的,所以大概的方法都差不多
    //對比參考一下
    //這是設定url跳轉的
    $objPHPExcel->getActiveSheet()->setCellValue(`E26`, `www.phpexcel.net`);
    $objPHPExcel->getActiveSheet()->getCell(`E26`)->getHyperlink()->setUrl(`http://www.phpexcel.net`);
    
    //這是設定在sheet內部跳轉的
    $objPHPExcel->getActiveSheet()->setCellValue(`E26`, `www.phpexcel.net`);
    $objPHPExcel->getActiveSheet()->getCell(`E26`)->getHyperlink()->setUrl("sheet://`Sheetname`!A1");
    那麼這裡個例子裡面是設定單例的,如果我們要設定整個陣列的某一列的都變成可點選的話,就需要用迴圈遍歷陣列然後,迴圈seturl了
    

參考:

  1. 官網

  2. https://github.com/Maatwebsite/Laravel-Excel/issues/926

  3. Change a cell into a clickable URL

相關文章