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; } }
启动项目,查看效果