zoukankan      html  css  js  c++  java
  • 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;
        }
    }

    启动项目,查看效果

     

  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/Jimc/p/12102788.html
Copyright © 2011-2022 走看看