Laravel中如何将MySQL表每行数据转为Excel的独立工作表?
Laravel实现MySQL表每行对应Excel独立工作表方案
推荐使用Laravel生态常用的maatwebsite/excel扩展包实现,具体步骤如下:
1. 安装依赖扩展包
首先确认你的Laravel版本和扩展包版本匹配,通过composer安装:
composer require maatwebsite/excel
如果需要自定义配置,可以执行发布配置文件命令:
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
2. 创建多Sheet导出类
在app/Exports目录下创建RowsAsSheetsExport类,用来遍历数据表行生成对应的Sheet:
<?php namespace App\Exports; use App\Models\YourTargetModel; // 替换为你自己的业务模型类 use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\WithMultipleSheets; class RowsAsSheetsExport implements WithMultipleSheets { use Exportable; public function sheets(): array { $sheets = []; // 数据量较大时请改用chunk分块查询,避免内存溢出 $dataRows = YourTargetModel::all(); foreach ($dataRows as $index => $row) { $sheets[] = new SingleRowSheet($row, $index + 1); } return $sheets; } }
3. 创建单Sheet内容类
同样在app/Exports目录下创建SingleRowSheet类,定义单个工作表的结构和内容:
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\FromArray; use Maatwebsite\Excel\Concerns\WithTitle; use Maatwebsite\Excel\Concerns\WithHeadings; class SingleRowSheet implements FromArray, WithTitle, WithHeadings { protected $row; protected $sheetNo; public function __construct($row, $sheetNo) { $this->row = $row; $this->sheetNo = $sheetNo; } // 自定义工作表表头,替换为你的表字段名 public function headings(): array { return [ '字段1名称', '字段2名称', '字段3名称', // 其余字段按需补充 ]; } // 返回当前行的内容,生成空模板时直接返回空数组即可 public function array(): array { return [ $this->row->toArray() ]; } // 自定义工作表名称,注意不要超过31字符、不能包含\/?*[]等特殊字符 public function title(): string { return '数据行_' . $this->sheetNo . '_' . $this->row->id; } }
4. 控制器中触发导出
在你的业务控制器中添加导出逻辑:
<?php namespace App\Http\Controllers; use App\Exports\RowsAsSheetsExport; use Maatwebsite\Excel\Facades\Excel; class ExcelExportController extends Controller { public function exportTemplate() { return Excel::download(new RowsAsSheetsExport, '自定义导出文件名.xlsx'); } }
内容的提问来源于stack exchange,提问作者Lusit
相关产品推荐
相关产品推荐

