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

Yii框架GridView实现分页与全量数据汇总行并追加至Excel导出末尾

没问题,我帮你一步步实现Yii GridView的当前页+全量数据汇总行,还能把汇总行加到Excel导出里~

一、先搞定GridView的双汇总行(当前页+全量数据)

你已经开启了showPageSummary和pageSummaryFunc,但默认的pageSummaryFunc只能计算当前页数据。要同时显示全量数据总和,得先在控制器里算出全量的汇总值,再在列配置里自定义显示内容:

步骤1:控制器中计算全量总和

确保这个总和是基于当前搜索条件的(比如用户过滤后的数据):

// 假设$searchModel是你的搜索模型,updated_amount是要汇总的字段
$filteredQuery = $searchModel->search(Yii::$app->request->queryParams)->query;
$totalAllSum = $filteredQuery->sum('updated_amount');

步骤2:GridView列配置自定义汇总内容

把计算好的$totalAllSum传入GridView,在目标列的pageSummary回调里同时显示当前页和全量总和:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'layout' => "{summary}\n{items}\n<div align='right'>{pager}</div>",
    'showPageSummary' => true, // 必须开启这个才会显示汇总行
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        [
            'attribute' => 'updated_amount',
            'pageSummaryFunc' => GridView::F_SUM, // 这个函数负责计算当前页总和
            'pageSummary' => function ($currentPageSum) use ($totalAllSum) {
                // 用HTML格式化显示双汇总,加粗突出重点
                return "<strong>当前页总和:</strong> {$currentPageSum}<br/><strong>全量数据总和:</strong> {$totalAllSum}";
            },
            'format' => 'decimal', // 按数字格式显示,避免科学计数法
        ],
        // 其他列配置...
    ],
]); ?>
二、把汇总行加到Excel导出末尾

如果用的是kartik/yii2-grid这类支持导出的扩展,我们可以利用导出回调函数,在生成Excel后插入汇总行:

完整的GridView带导出配置示例

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'layout' => "{summary}\n{items}\n<div align='right'>{pager}</div>",
    'showPageSummary' => true,
    // 导出配置
    'export' => [
        'target' => GridView::TARGET_BLANK,
        'exportConfig' => [
            GridView::EXCEL => [
                'filename' => '数据汇总_' . date('Ymd'),
                'onRenderSheet' => function ($sheet, $widget) use ($totalAllSum) {
                    // 获取Excel数据的最后一行
                    $lastRow = $sheet->getHighestRow();
                    // 在最后一行后插入新行作为汇总行
                    $sheet->insertNewRowBefore($lastRow + 1, 1);
                    
                    // 填充汇总内容(根据你的列位置调整单元格坐标)
                    $sheet->setCellValue('A' . ($lastRow + 1), '汇总');
                    // 处理当前页总和,去掉HTML标签
                    $currentPageSum = strip_tags($widget->columns[1]->pageSummary);
                    $sheet->setCellValue('B' . ($lastRow + 1), $currentPageSum);
                    $sheet->setCellValue('C' . ($lastRow + 1), "全量数据总和: {$totalAllSum}");
                    
                    // 给汇总行加样式(加粗+右对齐)
                    $style = [
                        'font' => ['bold' => true],
                        'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT]
                    ];
                    $sheet->getStyle('A' . ($lastRow + 1) . ':C' . ($lastRow + 1))->applyFromArray($style);
                },
            ],
        ],
    ],
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        [
            'attribute' => 'updated_amount',
            'pageSummaryFunc' => GridView::F_SUM,
            'pageSummary' => function ($currentPageSum) use ($totalAllSum) {
                return "<strong>当前页总和:</strong> {$currentPageSum}<br/><strong>全量数据总和:</strong> {$totalAllSum}";
            },
            'format' => 'decimal',
        ],
        // 其他列...
    ],
]); ?>
三、注意事项
  • 全量总和的计算一定要基于$searchModel->search()返回的查询对象,这样才能匹配用户的过滤条件(比如日期范围、关键词筛选)。
  • 如果用的是其他导出扩展(比如yii2-export),逻辑类似:先导出所有数据,再在Excel的最后一行插入汇总内容。
  • 导出时记得用strip_tags()处理HTML格式的汇总文本,避免Excel里出现<br/>这类标签。

内容的提问来源于stack exchange,提问作者Paweł Nowicki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:41:59