Laravel使用maatwebsite-excel导出Excel时如何对指定列进行求和
Laravel maatwebsite/excel 导出添加列求和的解决方案
下面提供两种常用的实现方案,可根据实际需求选择:
方案1:使用Excel公式实现动态求和(推荐)
该方案写入的是Excel原生求和公式,后续修改Excel内数据时求和结果会自动更新,实现步骤如下:
- 给
ClientExport类新增WithEvents接口的实现,引入对应命名空间 - 实现
registerEvents方法,在AfterSheet事件中插入汇总行和求和公式
修改后完整代码如下:
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithColumnWidths; use Maatwebsite\Excel\Concerns\WithEvents; // 新增引入 use Maatwebsite\Excel\Events\AfterSheet; // 新增引入 use App\Models\AdminClient; use Maatwebsite\Excel\Concerns\Exportable; class ClientExport implements FromCollection, WithHeadings, WithColumnWidths, WithEvents // 新增实现WithEvents接口 { use Exportable; public function columnWidths(): array { return [ 'A' => 10, 'B' => 35, 'C' => 35, 'D' => 35, 'E' => 35, 'F' => 35 ]; } public function collection() { return AdminClient::query()->get([ 'id', 'name', 'product', 'price', 'qty', 'total' ]); } public function headings(): array { return [ 'id', 'name', 'product', 'price', 'qty', 'total' ]; } // 新增事件注册方法 public function registerEvents(): array { return [ AfterSheet::class => function(AfterSheet $event) { // 计算最后一条数据的行号:1行表头 + 集合内所有数据行数 $lastDataRow = count($this->collection()) + 1; // 汇总行所在位置 $summaryRow = $lastDataRow + 1; // 写入汇总行前三个列的标识内容 $event->sheet->setCellValue('A'.$summaryRow, ''); $event->sheet->setCellValue('B'.$summaryRow, '合计'); $event->sheet->setCellValue('C'.$summaryRow, ''); // 写入三个数值列的求和公式 $event->sheet->setCellValue('D'.$summaryRow, "=SUM(D2:D{$lastDataRow})"); $event->sheet->setCellValue('E'.$summaryRow, "=SUM(E2:E{$lastDataRow})"); $event->sheet->setCellValue('F'.$summaryRow, "=SUM(F2:F{$lastDataRow})"); // 可选配置:给汇总行添加加粗样式,突出显示 $event->sheet->getStyle("A{$summaryRow}:F{$summaryRow}")->getFont()->setBold(true); }, ]; } }
方案2:追加静态汇总行(无公式)
如果不需要动态求和,只需要展示固定的统计值,可以直接在返回的集合末尾追加汇总行,不需要额外实现其他接口,仅修改collection方法即可:
public function collection() { $data = AdminClient::query()->get([ 'id', 'name', 'product', 'price', 'qty', 'total' ]); // 计算三个字段的总和 $sumPrice = $data->sum('price'); $sumQty = $data->sum('qty'); $sumTotal = $data->sum('total'); // 追加汇总行到集合末尾 $data->push([ 'id' => '', 'name' => '合计', 'product' => '', 'price' => $sumPrice, 'qty' => $sumQty, 'total' => $sumTotal ]); return $data; }
优缺点说明
- 优点:实现逻辑简单,不需要额外引入接口
- 缺点:求和结果是静态数值,修改Excel内的单元格数据不会自动更新统计结果
内容的提问来源于stack exchange,提问作者etranz
相关产品推荐
相关产品推荐

