本文记录通过laravel-excel:3将供应商信息导出为excel的功能,特别记录关于该拓展对图片、表格样式的操作。其中用到了php的可变变量
1、composer require “maatwebsite/excel”: “^3.1”
2、官方文档:https://docs.laravel-excel.com/3.1/getting-started/
excel导出类ExcelController实现WithDrawings、FromArray等接口:
<?php
namespace App\Http\Controllers;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithColumnWidths;
use Maatwebsite\Excel\Concerns\WithDrawings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
class ExcelController implements FromArray,WithColumnFormatting,WithColumnWidths,WithDrawings,WithEvents
{
protected $arr;
//$drawings为PhpOffice\PhpSpreadsheet\Worksheet\Drawing对象数组
protected $drawings;
public function __construct(array $arr,$drawings)
{
$this->arr= $arr;
$this->drawings = $drawings;
}
//导出数据
public function array(): array
{
return $this->arr;
}
//自定义单元格格式
public function columnFormats(): array
{
// return [
// 'B' => NumberFormat::FORMAT_DATE_DDMMYYYY,
// 'C' => NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE,
// ];
return [];
}
//自定义宽
public function columnWidths(): array
{
return [
'A'=>'20',
'B'=>'20',
'C'=>'20',
'D'=>'20',
'E'=>'20',
'F'=>'20',
'G'=>'20',
'H'=>'20',
'I'=>'20',
'J'=>'20',
'K'=>'20',
'L'=>'20',
'M'=>'20',
'N'=>'20',
];
}
//导出图片
public function drawings()
{
return $this->drawings;
}
//自定义高
public function registerEvents(): array
{
return [
AfterSheet::class => function(AfterSheet $event){
$event->sheet->getDelegate()->getDefaultRowDimension()->setRowHeight(50);
},
];
}
}
代码如下(数据库图片名以逗号’,'相隔):
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
class SupplierController extends Controller{
/**
* laravel-excel3导出
* 图片文件不能重复
* 取相关图片类的第一个图片文件展示
*/
public function supplier_excel(){
//表头
$sup_arr = [
['供应商名称','成立日期','统一社会信用代码','营业执照有效期','动物检验检疫证明','经营许可证'],
];
$sup = supplier::where('id',$su_id)->get(['su_name','start_time','code','exp'])->toArray();
//将供应商信息加到sup_arr数组中
foreach ($sup as $k => $v){
$sup_arr[] = array_values($v);
}
//获取图片名称
$img = supplier::where('id',$su_id)->get(['business_cert','zoon_cert'])->toArray();
$i = 2;
$drawings = [];
foreach ($img as $k => $v){
$img_name = explode(',',$v['zoon_cert']);
if (empty($img_name[0])) break;
//将对象命名为可变变量
$$i = new Drawing();
//自定义导出图片信息
$$i->setName('Logo');
$$i->setDescription('This is my logo');
$$i->setPath(env('APP_STORAGE').'supplier/'.$img_name[0]);
$$i->setHeight(50);
$$i->setCoordinates('E'.$i);
//将对象放入数组
$drawings[] = ${$i};
$i += 1;
}
//第二类图片
$i1 = 2;
foreach ($img as $k => $v){
$img_name = explode(',',$v['food_cert']);
if (empty($img_name[0])) break;
$$i = new Drawing();
$$i->setName('Logo');
$$i->setDescription('This is my logo');
$$i->setPath(env('APP_STORAGE').'supplier/'.$img_name[0]);
$$i->setHeight(50);
$$i->setCoordinates('F'.$i1);
$drawings[] = ${$i};
$i1 += 1;
}
//将数据与对象数组传入导出类
$export = new ExcelController($sup_arr,$drawings);
//下载excel文件
return Excel::download($export, 'supplier.xlsx');
}
}
excel下载的 response类型为’Symfony\Component\HttpFoundation\BinaryFileResponse’,可能与框架的响应类型不同。