Flutter SfDataGrid分页导出全部数据时汇总行数据错误求助
解决Flutter SfDataGrid分页导出全量数据时汇总行错误的问题
核心问题分析
你当前的代码循环导出每页数据,但SfDataGrid默认导出的汇总行是基于当前分页数据计算的,而非全量数据,导致导出的汇总值错误。要解决这个问题,需要手动计算全量数据的汇总值,然后替换导出流程中的错误汇总,或者直接构建包含正确汇总的完整数据列表再导出。
方案一:合并全量数据并手动添加正确汇总行
这种方法适合希望将所有数据导出到单个工作表,且汇总行是全量数据总和的场景:
- 合并所有分页数据,过滤掉分页自带的错误汇总行
- 基于全量原始数据计算汇总值
- 创建正确的汇总行并添加到合并后的列表
- 导出完整列表
示例代码:
// 1. 合并所有分页数据,过滤掉分页自带的汇总行(假设汇总行第一列值为"汇总") final List<DataGridRow> allDataRows = []; for (var page in viewModel.pagedRows) { allDataRows.addAll(page.where((row) => row.getCells()[0].value != '汇总')); } // 2. 基于全量原始数据计算汇总值(viewModel.allData是未分页的完整数据集) final double totalAmount = viewModel.allData.fold(0.0, (sum, item) => sum + item.amount); // 根据你的数据模型,补充其他需要汇总的字段计算 // 3. 创建正确的汇总行 final DataGridRow correctSummaryRow = DataGridRow( cells: [ DataGridCell(columnName: 'name', value: '汇总'), DataGridCell(columnName: 'amount', value: totalAmount), // 补充其他列的汇总值,比如数量、总价等 ], ); allDataRows.add(correctSummaryRow); // 4. 导出完整数据到Excel final excel.Workbook workbook = excel.Workbook(); final excel.Worksheet worksheet = workbook.worksheets[0]; key.currentState!.exportToExcelWorksheet(worksheet, rows: allDataRows); // 后续保存与分享逻辑不变 final List<int> bytes = workbook.saveAsStream(); workbook.dispose(); writeToFile('DataGrid.xlsx', bytes); Share.shareFiles([await getFilePath('DataGrid.xlsx')], subject: 'Exported Excel', mimeTypes: ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel']);
方案二:使用DataGridToExcelConverter自定义汇总行导出
如果需要保留多工作表的分页结构,但替换每个工作表中的汇总值为全量汇总(或每页真实汇总,根据需求调整),可以通过自定义转换器干预导出流程:
- 计算全量数据的汇总值
- 创建自定义DataGridToExcelConverter,重写汇总单元格的导出逻辑
- 导出时传入自定义转换器
示例代码:
// 1. 计算全量数据的汇总值 final double totalAmount = viewModel.allData.fold(0.0, (sum, item) => sum + item.amount); // 2. 自定义转换器,替换汇总行的目标列值 final customConverter = DataGridToExcelConverter() ..exportSummaryCell = (DataGridSummaryCell summaryCell, ExcelCell excelCell) { // 判断是否为需要替换的汇总列(比如amount列) if (summaryCell.columnName == 'amount') { excelCell.value = totalAmount; // 替换为全量汇总值 } else { // 其他汇总列保持原有逻辑 excelCell.value = summaryCell.value; } }; // 3. 循环导出每页数据,传入自定义转换器 final excel.Workbook workbook = excel.Workbook(); for (var i = 0; i < viewModel.pagedRows.length; i++) { final page = viewModel.pagedRows[i]; final excel.Worksheet worksheet = i == 0 ? workbook.worksheets[0] : workbook.worksheets.addWithName(i.toString()); key.currentState!.exportToExcelWorksheet(worksheet, rows: page, converter: customConverter); } // 后续保存与分享逻辑不变 final List<int> bytes = workbook.saveAsStream(); workbook.dispose(); writeToFile('DataGrid.xlsx', bytes); Share.shareFiles([await getFilePath('DataGrid.xlsx')], subject: 'Exported Excel', mimeTypes: ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel']);
关键注意事项
- 确保
viewModel.allData是未分页的完整数据集,否则汇总计算依然错误 - 如果分页数据中的汇总行是SfDataGrid自动生成的,需要过滤或替换,避免导出重复的错误汇总
- 若需要每页显示自身的分页汇总而非全量汇总,只需将方案二中的
totalAmount替换为当前页数据的计算值即可
内容的提问来源于stack exchange,提问作者bahadir arslan
相关产品推荐
相关产品推荐

