Выгрузка всей таблицы в Excel по кнопке Export

Есть таблица (все создано через визард экранов Entity Browse and Edit)
<groupTable>
с дефолтной пагинацией
<simplePagination/>
Добавлен руками
<action id="excel" caption="Export" type="excelExport" icon="font-icon:SAVE"/>
И кнопка
<button action="myTable.excel"/>
для выгрузки таблицы в xslx файл.
Все работает, эксель файл выгружается, но в эксель выгружается только 50 строк, которые есть на странице.
Если убрать пагинацию, то ожидаемо на страницу загружаются все данные таблицы. И в эксель выгружаются все данные. Но при этом загрузка страницы начинает занимать значительное время, что неудобно.
Как оставить пагинацию, но в эксель выгружать все данные таблицы? Почему это не сделали дефолтным поведением выгрузки в эксель?

Нет, и в этом случае выгружаются не все данные, а только в пределах значения свойства приложения defaultMaxFetchSize. По умолчанию это 10 000 записей.

Но при этом загрузка страницы начинает занимать значительное время, что неудобно.

В принципе, вы уже сами ответили на свой вопрос.
На экранах все механизмы выстроены под адекватную и отзывчивую работу UI, а не полноценный экспорт данных целыми таблицами из БД.
Кроме того, экспорт в файл Excel - это очень затратная по памяти операция.

Самое простое это сделать Отчет для такой выгрузки.

На форуме Cuba это не раз обсуждали:
Экспорт таблицы в Excel - Вопросы и проблемы - CUBA.Platform (cuba-platform.ru)
ExcelExporter.MAX_ROW_COUNT не могу изменить - Вопросы и проблемы - CUBA.Platform (cuba-platform.ru)

2 симпатии

Андрей, спасибо за ответ.
Пока не изучал функциональность Отчетов.
Для описанной выше задачи я реализовал кастомный хендлер в контроллере экрана для обработки загрузки экселя по кнопке - запрос всех имеющихся данных в таблице.
Сделал, как было написано в исходнике io.jmix.uiexport.exporter.excel.ExcelExporter.java:

Use this class to export Table into Excel format.
Just create an instance of ExportAction with withExporter method.

Получилось достаточно просто. Будет интересно по скорости выгрузки сравнить с реализацией через Отчеты.

@UiController("MyTable.browse")
@UiDescriptor("myTable-browse.xml")
@LookupComponent("myTable")
public class MyTableBrowse extends StandardLookup<MyTable> {

    @Named("myTable.excel")
    private ExcelExportAction myTableExcel;
    @Autowired
    private CollectionLoader<MyTable> myTableDl;
    @Autowired
    private Downloader downloader;

    @Subscribe("myTable.excel")
    @SuppressWarnings("unchecked")
    public void onMyTableExcel(Action.ActionPerformedEvent event) {
        myTableDl.setMaxResults(ExcelExporter.MAX_ROW_COUNT); //тут можно было бы посчитать кол-во строк в таблице, но все равно больше чем 65535 не выгрузить
        myTableDl.load();
        ExcelExporter ee = myTableExcel.withExporter(ExcelExporter.class);
        ee.exportTable(downloader, (Table<Object>) myTableExcel.getTarget(), ExportMode.ALL);
    }
}

Правда, не проверял для случая, когда строк больше 10000 - перебьет ли setMaxResult() свойство приложения defaultMaxFetchSize или нет?

1 симпатия

По аналогии с Cuba, свойство defaultMaxFetchSize применяется для выпадающих списков EntityPicker, таблиц без пагинации и прочих случаев, когда на связанный загрузчик явным образом не указывается ограничение числя записей.
В вашем случае приоритет за мaxResults.