Разбитый на страницы Flutter SfDataGrid Экспорт всех данных

Я использую 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и вмешиваться в процесс экспорта, однако я не нашел способа сделать это.

1 ответ

После хорошего сна я решил свою проблему, и, как я догадался, она была решена с помощью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 должен быть в коробке, но мне как-то удалось это сделать

Другие вопросы по тегам