Импорт и экспорт отчетов
Дополнение Jmix Reports предоставляет функции для обработки экспорта и импорта определений отчетов непосредственно из пользовательского интерфейса и программно.
Вручную
Дополнение Reports позволяет вручную импортировать и экспортировать отчеты непосредственно из экрана Reports с помощью кнопок Import и Export. Для получения дополнительной информации смотрите Экран списка отчетов.
Использование ReportImportExport
Дополнение Jmix Reports предоставляет API ReportImportExport, который позволяет импортировать ZIP-файлы с экспортированными отчетами.
Рассмотрим пример автоматизированного развертывания отчетов в рамках проекта Jmix. Отчеты были вручную экспортированы и сохранены как ZIP-архивы в директорию ресурсов проекта.
@Component
public class DemoDataInitializer { (1)
@Autowired
private DataManager dataManager;
@Autowired
private Resources resources;
@Autowired
protected ReportImportExport reportImportExport;
private final static String REPORT_LOCATION = "com/company/library/reports/";
@EventListener
@Authenticated
public void onApplicationStarted(ApplicationStartedEvent event) { (2)
importReport();
}
private void importReport(){
InitFlags initFlags = dataManager.load(InitFlags.class) (3)
.id(1)
.lockMode(LockModeType.PESSIMISTIC_WRITE)
.optional()
.orElseGet(() -> {
InitFlags entity = dataManager.create(InitFlags.class);
entity.setId(1);
return entity;
});
if (!Boolean.TRUE.equals(initFlags.getReportsInitialized())) {
importReport("Book Items location.zip");
importReport("Book Record.zip");
importReport("Publication details.zip");
importReport("Publications grouped by types and books.zip");
importReport("Recently added book items.zip");
initFlags.setReportsInitialized(true);
dataManager.save(initFlags);
}
}
private void importReport(String reportFileName) {
String location = REPORT_LOCATION + reportFileName;
log.info("Initializing report from " + location);
try (InputStream stream = resources.getResourceAsStream(location)) {
if (stream != null) {
reportImportExport.importReports(IOUtils.toByteArray(stream)); (4)
} else {
log.info("Not found: " + location);
}
} catch (IOException e) {
log.error("Unable to initialize reports", e);
}
}
}
| 1 | Бин DemoDataInitializer отвечает за запуск импорта отчетов при старте приложения. |
| 2 | Этот метод автоматически вызывается при публикации события ApplicationStartedEvent. Мы поместим нашу логику инициализации сюда. ApplicationStartedEvent - это событие Spring, которое публикуется после полной инициализации приложения и его готовности обрабатывать запросы. Оно сигнализирует об успешном запуске вашего Jmix приложения. |
| 3 | DemoDataInitializer использует сущность InitFlags для сохранения флага, который устанавливается в true после первоначального импорта. Этот флаг использует пессимистическую блокировку базы данных, чтобы избежать параллельного выполнения при запуске нескольких серверов в кластере. Более того, у вас есть гибкость в определении альтернативных условий для создания/обновления отчетов или даже запуска ReportImportExport с помощью ручной команды в пользовательском интерфейсе приложения. |
| 4 | Бин ReportImportExport обрабатывает фактический импорт отчетов. |