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

Flutter SfDataGrid分页导出全部数据时汇总行数据错误求助

解决Flutter SfDataGrid分页导出全量数据时汇总行错误的问题

核心问题分析

你当前的代码循环导出每页数据,但SfDataGrid默认导出的汇总行是基于当前分页数据计算的,而非全量数据,导致导出的汇总值错误。要解决这个问题,需要手动计算全量数据的汇总值,然后替换导出流程中的错误汇总,或者直接构建包含正确汇总的完整数据列表再导出。

方案一:合并全量数据并手动添加正确汇总行

这种方法适合希望将所有数据导出到单个工作表,且汇总行是全量数据总和的场景:

  1. 合并所有分页数据,过滤掉分页自带的错误汇总行
  2. 基于全量原始数据计算汇总值
  3. 创建正确的汇总行并添加到合并后的列表
  4. 导出完整列表

示例代码:

// 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自定义汇总行导出

如果需要保留多工作表的分页结构,但替换每个工作表中的汇总值为全量汇总(或每页真实汇总,根据需求调整),可以通过自定义转换器干预导出流程:

  1. 计算全量数据的汇总值
  2. 创建自定义DataGridToExcelConverter,重写汇总单元格的导出逻辑
  3. 导出时传入自定义转换器

示例代码:

// 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:05:34