Laravel Excel模板導出-帶圖片


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()方法是自己封裝的,需要多個圖片導出時方便調用。

結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM