Laravel Excel版本 3.1
1、數據准備
建個2個表,加點數據,控制器中查數據,給模板使用。
表1-order:id, order_no, img_path, note
表2-order_item:id, order_id, sku, num
查數據:
$data = OrderModel::with('item')->get()->toArray();
//使用關聯模型hasmany查詢
$data = $data[0];
dd($data);
打印結果:

2、模板准備
新建模板:resources/views/order_export.blade.php
<table>
<thead>
</thead>
<tbody>
<tr>
<td colspan="2" style="vertical-align: center;"><b>訂單號</b></td>
<td colspan="2" style="vertical-align: center;"><b>備注</b></td>
<td colspan="2" style="vertical-align: center;"><b>圖片</b></td>
</tr>
<tr>
<td colspan="2" style="vertical-align: center;">xxx</td>
<td colspan="2" style="vertical-align: center;">xxx</td>
<td colspan="2" style="vertical-align: center;">xxx</td>
</tr>
<tr>
<td colspan="2" style="vertical-align: center;"><b>SKU</b></td>
<td colspan="2" style="vertical-align: center;"><b>數量</b></td>
</tr>
<tr>
<td colspan="2" style="vertical-align: center;">xxx</td>
<td colspan="2" style="vertical-align: center;">xxx</td>
</tr>
</tbody>
</table>
3、新建導出類
php artisan make:export OrderExport
//app/Exports/OrderExport.php
OrderExport
3.1、實現FromView接口
實現view()方法
use Maatwebsite\Excel\Concerns\FromView;
class OrderExport implements FromView
{
public function view(): View
{
$data = OrderModel::with('item')->get()->toArray();//見上1、數據准備
return view('order_export', ['data'=>$data[0]]);
}
}
3.2、調整模板
<table>
<thead>
</thead>
<tbody>
<tr>
<td colspan="2" style="vertical-align: center;"><b>訂單號</b></td>
<td colspan="2" style="vertical-align: center;"><b>備注</b></td>
<td colspan="2" style="vertical-align: center;"><b>圖片</b></td>
</tr>
<tr>
<td colspan="2" style="vertical-align: center;">{{ $data['order_no'] }}</td>
<td colspan="2" style="vertical-align: center;">{{ $data['note'] }}</td>
<td colspan="2" style="vertical-align: center;">xxx</td>
</tr>
<tr>
<td colspan="2" style="vertical-align: center;"><b>SKU</b></td>
<td colspan="2" style="vertical-align: center;"><b>數量</b></td>
</tr>
@foreach($data['item'] as $k=>$item)
<tr>
<td colspan="2" style="vertical-align: center;">{{ $item['sku'] }}</td>
<td colspan="2" style="vertical-align: center;">{{ $item['num'] }}</td>
</tr>
@endforeach
</tbody>
</table>
3.3、控制器中調用
//控制器中寫個方法
public function index()
{
return Excel::download(new OrderExport(), 'test.xlsx');
}
//路由指向,即可導出
3.4、導出結果:

這時候已經完成導出,但有些需要注意的,模板中的css只能內嵌而且只有少數的樣式能夠使用,具體那些沒試,只知道邊框線就沒效果。還有就是圖片img標簽也是不適用,導出時出不了效果的。
4、圖片導出
圖片導出需要借助 WithEvents 監聽事件,這個手冊中並沒有講到。
還是上面的導出類:OrderExport,需要實現WithEvents 並實現registerEvents()方法
監聽excel表格完成時,插入圖片:
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\WithEvents;
class OrderExport implements FromView,WithEvents
{
public function view(): View
{
$data = OrderModel::with('item')->get()->toArray();
return view('order_export', ['data'=>$data[0]]);
}
public function registerEvents(): array
{
return [ AfterSheet::class => function(AfterSheet $event){
$data = OrderModel::find(1);
$this->setImage2Excel($event, 'E2' ,$data['img_path'], 0,90);
//E2時表格橫E豎2,圖片需要出現的位置
}];
}
/**
* 添加圖片到excel
* @param $event
* @param $position:excel表位置
* @param $path:圖片路徑
* @param $width:圖片寬度
* @param $height:圖片高度
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
private function setImage2Excel($event, $position, $path, $width,$height){
$drawing = new\PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Logo');
$drawing->setDescription('Logo');
$drawing->setCoordinates($position);
$drawing->setPath(public_path($path));
($width==0)?null:$drawing->setWidth($width);
($height==0)?null:$drawing->setHeight($height);
$drawing->setWorksheet($event->sheet->getDelegate());
}
}
setImage2Excel()方法是自己封裝的,需要多個圖片導出時方便調用。
結果:

