Есть таблица (все создано через визард экранов 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)
Андрей, спасибо за ответ.
Пока не изучал функциональность Отчетов.
Для описанной выше задачи я реализовал кастомный хендлер в контроллере экрана для обработки загрузки экселя по кнопке - запрос всех имеющихся данных в таблице.
Сделал, как было написано в исходнике 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 или нет?
По аналогии с Cuba, свойство defaultMaxFetchSize
применяется для выпадающих списков EntityPicker
, таблиц без пагинации и прочих случаев, когда на связанный загрузчик явным образом не указывается ограничение числя записей.
В вашем случае приоритет за мaxResults.