1. 程式人生 > >laravel-admin 自定義匯出excel功能,並匯出圖片

laravel-admin 自定義匯出excel功能,並匯出圖片

https://www.jianshu.com/p/91975f66427d

最近用laravel-admin在做一個小專案,其中用到了excel匯出功能。

但是laravel-admin自帶的匯出功能不帶圖片,並且匯出的資料有很多冗餘的欄位,並非我所需要的功能。

所以參考官方文件調整程式碼,實現了自定義匯出excel檔案,並且帶上圖片;

步驟如下:

1. 安裝laravel-excel外掛

可參考laravel5.5 中使用laravel-excel

composer require maatwebsite/excel:~2.1.0

php artisan vendor
:publish --provider="MaatwebsiteExcelExcelServiceProvider"

2. 自定義匯出類

我是參照laravel-admin官方文件建立的匯出類:app/Admin/Extensions/ExcelExpoter.php;

匯出類中需要引入使用的Excel,和匯入圖片所使用的PHPExcel_Worksheet_Drawing

use MaatwebsiteExcelFacadesExcel;

use PHPExcel_Worksheet_Drawing;
具體程式碼如下: 
<?php
/** * Created by PhpStorm. * User: yuran * Date: 2018/10/13 * Time: 10:04 */ namespace App\Admin\Extensions; use Encore\Admin\Grid\Exporters\AbstractExporter; use Maatwebsite\Excel\Facades\Excel; use PHPExcel_Worksheet_Drawing; class ExcelExpoter extends AbstractExporter {
protected $head = []; protected $body = []; public function setAttr($head, $body){ $this->head = $head; $this->body = $body; } public function export() { //定義檔名稱為日期拼上uniqid() $fileName = date('YmdHis') . '-' . uniqid(); Excel::create($fileName, function($excel) { $excel->sheet('sheet1', function($sheet) { // 這段邏輯是從表格資料中取出需要匯出的欄位 $head = $this->head; $body = $this->body; //init列 $title_array = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH']; $rows = collect([$head]); //寫入標題 $sheet->rows($rows); collect( $this->getData() )->map( function ($item,$k)use($body,$sheet,$title_array ) { foreach ($body as $i=>$keyName){ if($keyName == 'url') { //判斷圖片列,如果是則放圖片 $objDrawing = new PHPExcel_Worksheet_Drawing; $v = public_path('/upload/'). array_get($item, $keyName); //拼接圖片地址 $objDrawing->setPath( $v ); $sp = $title_array[$i]; $objDrawing->setCoordinates( $sp . ($k+2) ); $sheet->setHeight($k+2, 65); //設定高度 $sheet->setWidth(array( $sp =>12)); //設定寬度 $objDrawing->setHeight(80); $objDrawing->setOffsetX(1); $objDrawing->setRotation(1); $objDrawing->setWorksheet($sheet); } else { //否則放置文字資料 $v = array_get($item, $keyName); $sheet->cell($title_array[$i] . ($k+2), function ($cell) use ($v) { $cell->setValue($v); }); } } }); }); })->export('xls'); } }

3. 呼叫

在model-grid中使用這個匯出類:

 $excel = new ExcelExpoter();
        $excel->setAttr(['id', '名稱', '型別', '二維碼', '上傳人'], ['id', 'name', 'type', 'url', 'admin']);
        $grid->exporter($excel);

4. 最終效果
原資料

 

匯出結果