• UReport2报表引擎:自定义报表存储器(三)


    一、默认报表存储器

    UReport2默认提供的名为“服务器文件系统”的报表存储机制,实际上是实现了UReport2提供的com.bstek.ureport.provider.report.ReportProvider接口。接口源码如下:

    public interface ReportProvider {
        /**
         * 根据报表名加载报表文件
         * @param file 报表名称
         * @return 返回的InputStream
         */
        InputStream loadReport(String file);
        /**
         * 根据报表名,删除指定的报表文件
         * @param file 报表名称
         */
        void deleteReport(String file);
        /**
         * 获取所有的报表文件
         * @return 返回报表文件列表
         */
        List<ReportFile> getReportFiles();
        /**
         * 保存报表文件
         * @param file 报表名称
         * @param content 报表的XML内容
         */
        void saveReport(String file,String content);
        /**
         * @return 返回存储器名称
         */
        String getName();
        /**
         * @return 返回是否禁用
         */
        boolean disabled();
        /**
         * @return 返回报表文件名前缀
         */
        String getPrefix();
    }

    实现了ReportProvider接口后,只需要将实现类配置到Spring中,让其成为一个标准的Spring Bean,这样UReport2就会检测到它而将其加载。

    如果想要禁用系统提供的默认报表存储器,只需要把 ureport2-core 包下的 ureport.properties 文件拷贝一份放到自己的根目录下:

     配置文件内容如下:

    ureport.disableHttpSessionReportCache=false
    ureport.disableFileProvider=true
    ureport.fileStoreDir=/WEB-INF/ureportfiles
    ureport.debug=true

    将ureport.disableFileProvider改成true,即可禁用默认报表存储器。

    二、自定义报表存储器

    如果想要定义自己的报表存储器,只需要实现了ReportProvider接口后,并将实现类配置到Spring中,让其成为一个标准的Spring Bean,这样UReport2就会检测到它而将其加载。

    1、表结构设计 

    字段名 类型 描述
    id varchar(32) primary key 主键
    name varchar(100) 报表名称
    content mediumblob 报表内容
    create_time timestamp 创建时间
    update_time timestamp 更新时间

    2、需要的方法

    public interface ReportFileService extends IService<UReportFile> {
    
        /**
         *  根据报表名称检查报表是否存在
         *
         * @param name 报表名称
         */
        boolean checkExistByName(String name);
    
        /**
         *  根据报表名称查询报表
         *
         * @param name 报表名称
         */
        UReportFile getReportFileByName(String name);
    
        /**
         * 查询全部报表
         */
        List<UReportFile> listAllReportFile();
    
        /**
         * 根据报表名称删除报表
         *
         * @param name 报表名称
         */
        boolean removeReportFileByName(String name);
    
    
        /**
         *  保存报表
         */
        boolean saveReportFile(UReportFile entity);
    
        /**
         *  更新报表
         */
        boolean updateReportFile(UReportFile entity);
    }

    3、自定义报表存储器

    @Component
    @Setter
    public class MySQLProvider implements ReportProvider {
    
        /**
         * 存储器名称
         */
        private static final String NAME = "mysql-provider";
    
        /**
         * 报表文件名前缀
         */
        private String prefix = "mysql:";
    
        /**
         * 是否禁用
         */
        private boolean disabled = false;
    
        @Autowired
        private ReportFileService reportFileService;
    
        /**
         * 根据报表名加载报表文件
         *
         * @param file 报表名称
         * @return 返回的InputStream
         */
        @Override
        public InputStream loadReport(String file) {
            UReportFile reportFile = reportFileService.getReportFileByName(getCorrectName(file));
            ByteArrayInputStream stream = null;
            if (ObjectUtil.isNotEmpty(reportFile)) {
                try {
                    stream = new ByteArrayInputStream(reportFile.getContent());
                } catch (Exception e) {
                    throw new ReportException(e);
                }
            }
            return stream;
        }
    
        /**
         * 根据报表名,删除指定的报表文件
         *
         * @param file 报表名称
         */
        @Override
        public void deleteReport(String file) {
            reportFileService.removeReportFileByName(getCorrectName(file));
        }
    
        /**
         * 获取所有的报表文件
         *
         * @return 返回报表文件列表
         */
        @Override
        public List<ReportFile> getReportFiles() {
            List<UReportFile> list = reportFileService.listAllReportFile();
            List<ReportFile> reportList = new ArrayList<>();
            for (UReportFile file : list) {
                reportList.add(new ReportFile(file.getName(), file.getUpdateTime()));
            }
            return reportList;
        }
    
        /**
         * 保存报表文件
         *
         * @param file 报表名称
         * @param content 报表的XML内容
         */
        @Override
        public void saveReport(String file, String content) {
            file = getCorrectName(file);
            UReportFile reportFile = reportFileService.getReportFileByName(file);
            if(ObjectUtil.isEmpty(reportFile)){
                reportFile = new UReportFile();
                reportFile.setName(file);
                reportFile.setContent(content.getBytes());
                reportFileService.save(reportFile);
            }else{
                reportFile.setContent(content.getBytes());
                reportFileService.updateReportFile(reportFile);
            }
        }
    
        /**
         * @return 返回存储器名称
         */
        @Override
        public String getName() {
            return NAME;
        }
    
        /**
         * @return 返回是否禁用
         */
        @Override
        public boolean disabled() {
            return disabled;
        }
    
        /**
         * @return 返回报表文件名前缀
         */
        @Override
        public String getPrefix() {
            return prefix;
        }
    
        /**
         * 获取没有前缀的文件名
         *
         * @param name 报表名称
         */
        private String getCorrectName(String name){
            if(name.startsWith(prefix)){
                name = name.substring(prefix.length());
            }
            return name;
        }
    }

    启动项目,查看效果

     

  • 相关阅读:
    苹果 macOS 安装 Source Code Pro
    C# 中代码执行 ping 操作
    WPF 中 Path 使用虚线
    查看 Java Web 开发环境软件是 32 位还是 64 位
    linux 磁盘io监控
    Linux下系统如何监控服务器硬件、操作系统、应用服务和业务
    ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法
    完全卸载oracle11g步骤
    用JDBC连接SQL Server2017数据库
    oracle INS-13001 环境不满足最低要求
  • 原文地址:https://www.cnblogs.com/Jimc/p/12102788.html
Copyright © 2020-2023  润新知