You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用maatwebsite-excel导出Excel时如何对指定列进行求和

Laravel maatwebsite/excel 导出添加列求和的解决方案

下面提供两种常用的实现方案,可根据实际需求选择:


方案1:使用Excel公式实现动态求和(推荐)

该方案写入的是Excel原生求和公式,后续修改Excel内数据时求和结果会自动更新,实现步骤如下:

  1. 给ClientExport类新增WithEvents接口的实现,引入对应命名空间
  2. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:09:00