我正在使用带分页的SfDataGrid,我想导出所有数据,不仅是当前页面,但我无法正确实现。
我当前的代码如下。
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);
}
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
解决了。
CustomDataGridToExcelConverter converter = CustomDataGridToExcelConverter();
final excel.Workbook workbook = excel.Workbook();
workbook.worksheets[0].name = "1";
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 + 1).toString());
converter.page = i;
key.currentState!.exportToExcelWorksheet(excludeColumns: ['id'], worksheet, rows: page, converter: converter,
cellExport: (details) async {
details.excelRange.cellStyle.hAlign = excel.HAlignType.center;
});
}
final List<int> bytes = workbook.saveAsStream();
workbook.dispose();
writeToFile('excel.xlsx', bytes);
我的CustomDataGridToExcelConverter
类在下面
class CustomDataGridToExcelConverter extends DataGridToExcelConverter {
int page = 0;
@override
void exportToExcelWorksheet(SfDataGrid dataGrid, List<DataGridRow>? rows, Worksheet worksheet) {
(dataGrid.source as LogbookViewModel).silentHandlePageChange(page == 0 ? 0 : page - 1, page);
super.exportToExcelWorksheet(dataGrid, rows, worksheet);
}
silentHandlePageChange
方法是handlePageChange
的替代方法,它不通知侦听器。
void silentHandlePageChange(int oldPageIndex, int newPageIndex) async {
_dataGridRows = _pagedRows[newPageIndex];
_currentPage = newPageIndex;
}
在我看来,分页excel导出应该在框中,但我设法以某种方式