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
相关产品推荐
相关产品推荐

