如何在Maatwebsite/Laravel-Excel 3.1版本中实现Excel文件编辑功能
maatwebsite/laravel-excel 3.1 版本编辑已有Excel文件实现方案
3.1版本移除了原2.1的Excel::load()链式操作语法,推荐通过「读取文件内容→修改内容→导出新文件」的流程实现需求,以下是两种常用可行方案:
方案一:简单数据编辑(无需保留原有复杂样式)
步骤1:创建导入类读取文件内容
首先执行Artisan命令生成导入类:
php artisan make:import ExcelEditImport
修改生成的app/Imports/ExcelEditImport.php文件,使用ToCollection接口直接获取文件所有内容:
<?php namespace App\Imports; use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\ToCollection; class ExcelEditImport implements ToCollection { public function collection(Collection $rows) { return $rows; } }
步骤2:读取文件并修改内容
在业务逻辑中读取目标文件,对数据进行自定义修改:
// 读取原有Excel文件获取数据集合 $rows = \Maatwebsite\Excel\Facades\Excel::toCollection(new ExcelEditImport, public_path('file.csv'))->first(); // 自定义修改逻辑示例 $modifiedRows = $rows->map(function ($row) { // 可根据需求修改指定列内容 $row[1] = '修改后的内容' . $row[1]; return $row; });
步骤3:将修改后的数据导出为新文件
可直接用匿名导出类快速导出修改后的内容:
// 直接导出修改后的数据 return \Maatwebsite\Excel\Facades\Excel::download( new class($modifiedRows) implements \Maatwebsite\Excel\Concerns\FromCollection { protected $rows; public function __construct($rows) { $this->rows = $rows; } public function collection() { return $this->rows; } }, '修改后的文件.xlsx' );
方案二:保留原有样式/公式的编辑场景
如果需要保留原有Excel的样式、公式、格式,需要使用事件监听直接操作工作表对象:
- 导入类引入
WithEvents接口,监听工作表加载完成事件修改内容:
<?php namespace App\Imports; use Maatwebsite\Excel\Concerns\WithEvents; use Maatwebsite\Excel\Events\AfterSheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; class ExcelEditWithStyleImport implements WithEvents { public function registerEvents(): array { return [ AfterSheet::class => function(AfterSheet $event) { /** @var Worksheet $sheet */ $sheet = $event->sheet->getDelegate(); // 直接修改指定单元格内容,原有样式不会丢失 $sheet->setCellValue('A2', '修改后的单元格内容'); // 批量修改行数据 $sheet->fromArray(['新值1', '新值2', '新值3'], null, 'B2'); }, ]; } }
- 绑定原有文件导出即可保留全部原有格式:
return \Maatwebsite\Excel\Facades\Excel::download( new ExcelEditWithStyleImport(), '带样式修改后的文件.xlsx', \Maatwebsite\Excel\Excel::XLSX )->setFile(new \Symfony\Component\HttpFoundation\File\File(public_path('原文件.xlsx')));
内容的提问来源于stack exchange,提问作者Bhargav Chaniyara
相关产品推荐
相关产品推荐

