导入导出报表

Jmix 报表扩展组件提供了直接从 UI 或通过编程方式导出和导入报表定义的功能。

手动操作

Reports 视图可以点击 ImportExport 按钮手动导入或导出报表。参阅 报表列表视图

使用 ReportImportExport

Jmix 报表扩展组件提供了 ReportImportExport API,可用于导入之前从 Jmix 导出的报表 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 bean 负责在应用程序启动时触发导入报表。
2 ApplicationStartedEvent 发布时,会自动执行该方法。这里我们可以编写初始化的逻辑。ApplicationStartedEvent 是一个 Spring 事件,会在应用程序完成初始化并可以接收任务时发出。表示 Jmix 程序启动成功。
3 DemoDataInitializer 使用了一个 InitFlags 实体,在初次导入后持久化设置为 true。该标记使用数据库的悲观锁,以避免群集中的多个服务启动时并发执行。此外,可以在界面中定义不同的条件来创建或更新报表,甚至可以通过手动命令触发 ReportImportExport
4 ReportImportExport bean 处理具体的导入操作。