路由定义为GET
Route::get('/export', [OrderController::class, 'export']);
控制器转发
public function export(Request $request): BinaryFileResponse
{
return Excel::download(new OrderExport($request->get('status', -1)), 'order.xlsx');
}
业务代码
<?php
namespace App\Exports;
use App\Models\Order;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class OrderExport implements FromCollection, WithHeadings, WithColumnFormatting, WithMapping
{
public $status;
public function __construct(int $status)
{
$this->status = $status;
}
public function collection(): Collection
{
$query = Order::query();
if ($this->status != -1) {
$query->where('status', $this->status);
}
return $query->get();
}
public function headings(): array
{
return [
'编号',
'创建人',
'中队长',
'人员',
'名称',
'备注',
'状态',
'创建时间',
'更新时间'
];
}
public function columnFormats(): array
{
return [
'H' => NumberFormat::FORMAT_DATE_YYYYMMDD,
'I' => NumberFormat::FORMAT_DATE_YYYYMMDD,
];
}
public function map($row): array
{
return [
$row->id,
$row->founder->name ?? '无',
$row->squadron->name ?? '无',
$row->player->name ?? '无',
$row->name,
$row->remark ?: '无',
$this->statusMap($row->status),
Date::dateTimeToExcel($row->created_at),
Date::dateTimeToExcel($row->updated_at),
];
}
public function statusMap($status): string
{
switch ($status) {
case 0:
$statusText = '待处理';
break;
case 1:
$statusText = '处理中';
break;
case 2:
$statusText = '待审核';
break;
case 3:
$statusText = '已完成';
break;
default:
$statusText = '未知';
}
return $statusText;
}
}