3.5.5.2.6. ExcelAction

ExcelAction - действие с коллекцией, предназначенное для экспорта содержимого таблицы в файл XLS.

Если в таблице есть выделенные строки, то действие предлагает пользователю выбор: экспортировать только выделенные строки, или все содержимое. Заголовок и сообщение диалога выбора можно переопределить в проекте путем добавления в главный пакет сообщений с ключами actions.exportSelectedTitle и actions.exportSelectedCaption.

Действие реализовано классом com.haulmont.cuba.gui.actions.list.ExcelAction и объявляется в XML с помощью атрибута type="excel". Общие свойства действий можно конфигурировать с помощью атрибутов элемента action, подробнее см. раздел Декларативное создание действий. Ниже рассматриваются параметры, специфичные для класса ExcelAction.

  • fileName - имя файла экспорта. Если не задано, то генерируется автоматически на основе имени сущности.

  • exportAggregation - экспортировать ли строки агрегации, если они существуют в таблице. По умолчанию true.

Например:

<action id="excel" type="excel">
    <properties>
        <property name="fileName" value="customers"/>
        <property name="exportAggregation" value="false"/>
    </properties>
</action>

В качестве альтернативы, действие можно инжектировать в контроллер экрана и сконфигурировать, используя сеттеры:

@Named("customersTable.excel")
private ExcelAction customersTableExcel;

@Subscribe
public void onInit(InitEvent event) {
    customersTableExcel.setFileName("customers");
    customersTableExcel.setExportAggregation(false);
}

Для того, чтобы произвести какие-либо проверки, или взаимодействовать с пользователем перед выполнением действия, необходимо подписаться на событие ActionPerformedEvent действия и в нужный момент вызвать метод execute(). В примере ниже перед выполнением действия отображается диалог подтверждения:

@Named("customersTable.excel")
private ExcelAction customersTableExcel;

@Subscribe("customersTable.excel")
public void onCustomersTableExcel(Action.ActionPerformedEvent event) {
    dialogs.createOptionDialog()
            .withCaption("Please confirm")
            .withMessage("Are you sure you want to print the content to XLS?")
            .withActions(
                    new DialogAction(DialogAction.Type.YES)
                            .withHandler(e -> customersTableExcel.execute()), // execute action
                    new DialogAction(DialogAction.Type.NO)
            )
            .show();
}

Можно также подписаться на ActionPerformedEvent, и вместо вызова метода execute() действия, использовать класс ExcelExporter напрямую.