匯出方法抽離:
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Cell\StringValueBinder;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class Export extends StringValueBinder implements FromCollection,
ShouldAutoSize,WithColumnFormatting,WithCustomValueBinder,WithStrictNullComparison,WithEvents
{
private $row;
private $data;
private $mergeCell;
private $columnName;
private $formatNumber;
/*
* $mergeCell $columnName :合併單元格所需引數;
* $mergeCell 需要合併的位置陣列以MAP形式儲存 [開始行=>結束行]
* $columnName 需要合併列 與合併行數結合使用ARRAY儲存 ['A','B']
*/
public function __construct($row,$data,$mergeCell=null,$columnName=null,$formatNumber=[])
{
$this->row = $row;
$this->data = $data;
$this->mergeCell = $mergeCell;
$this->columnName = $columnName;
$this->formatNumber = $formatNumber;
}
public function collection()
{
$row = $this->row;
$data = $this->data;
//設定表頭
foreach ($row[0] as $key => $value) {
$key_arr[] = $key;
}
//輸入資料
foreach ($data as $key => &$value) {
$js = [];
for ($i=0; $i < count($key_arr); $i++) {
$js = array_merge($js,[ $key_arr[$i] => $value[ $key_arr[$i] ] ]);
}
array_push($row, $js);
unset($val);
}
return collect($row);
}
public function registerEvents(): array
{
// TODO: Implement registerEvents() method.
if ($this->mergeCell && $this->columnName){
return [
AfterSheet::class => function(AfterSheet $event){
foreach ($this->columnName as $column){
foreach ($this->mergeCell as $key=>$value){
$event->sheet->getDelegate()->mergeCells($column.$key.':'.$column.$value);
}
}
}
];
}
return [];
}
public function columnFormats(): array{
$formatNumber = [];
foreach ($this->formatNumber as $column){
$formatNumber[$column] = NumberFormat::FORMAT_TEXT;
}
return $formatNumber;
}
}
使用:
/*表頭表體都為二維陣列*/
$row=[['row1'=>'列1','row2'=>'列2']];
/*與表頭key對應,缺少資料包錯*/
$list=[['row1'=>'行1列1','row2'=>'行1列2'],['row1'=>'行2列1','row2'=>'行2列2']];
/*將第一行到第三行,第五行到第七行的A,B,C列各自合併*/
$mergeCell=[1=>3,5=>7];
$columnName=["A","B","C"];
/*數字過長的列轉換格式防止科學計數*/
$formatNumber=['A','B','C'];
//上方A,B,C列都為示意,根據自己需求調整,對應EXCEL的列
return Excel::download(new Export($row,$list,$mergeCell,$columnName,$formatNumber),'fileName');
本作品採用《CC 協議》,轉載必須註明作者和本文連結