Search code examples
flutterexport-to-excelsyncfusionsfdatagrid

Paginated Flutter SfDataGrid Exporting All Data


I am using SfDataGrid with pagination and I would like to export all data not only the current page but I couldn't achieve it correctly.

My current code is below.

 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']);

With this code, I can correctly export paginated data to related worksheets. But the problem is summary rows because the export system uses the current visible datagrid's page's summary values while exporting and this causes data errors in the exported file.

I think I should use DataGridToExcelConverter and intervene exporting process however I didn't find a way to do it.


Solution

  • After taking a good sleep I solved my problem and as I guessed it was solved by using 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);
    

    And my CustomDataGridToExcelConverter class is like below

    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 method is an alternate of handlePageChange which doesn't notify listeners.

      void silentHandlePageChange(int oldPageIndex, int newPageIndex) async {
        _dataGridRows = _pagedRows[newPageIndex];
        _currentPage = newPageIndex;
      }
    

    In my opinion, paged excel export should be in the box but I managed to work it somehow