關於laravel5的excel包maatwebsite/excel的使用筆記
關於安裝
官網已經很詳細了,不再描述.
http://www.maatwebsite.nl/laravel-excel/docs/getting-started
關於匯入
匯入的話只有幾個小地方需要注意:
-
匯入的時候會有產生一些null的cells
$reader->ignoreEmpty(); //or //在迴圈遍歷匯入的資料的時候主動忽略null
-
關於中文或者亂碼問題
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` ),
-
匯入的時候只讀取第一個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:
這裡是將陣列轉變為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:
這裡是將一個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了
參考: