一、默认报表存储器
UReport2默认提供的名为“服务器文件系统”的报表存储机制,实际上是实现了UReport2提供的com.bstek.ureport.provider.report.ReportProvider接口。接口源码如下:
publicinterfaceReportProvider {
**
* 根据报表名加载报表文件
*@paramfile 报表名称
*@return返回的InputStream
*/
InputStream loadReport(String file);
/**
* 根据报表名,删除指定的报表文件
*@paramfile 报表名称
*/
voiddeleteReport(String file);
/**
* 获取所有的报表文件
*@return返回报表文件列表
*/
List<ReportFile>getReportFiles();
/**
* 保存报表文件
*@paramfile 报表名称
*@paramcontent 报表的XML内容
*/
voidsaveReport(String file,String content);
/**
*@return返回存储器名称
*/
String getName();
/**
*@return返回是否禁用
*/
booleandisabled();
/**
*@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、表结构设计
字段名类型描述
idvarchar(32) primary key主键
namevarchar(100)报表名称
contentmediumblob报表内容
create_timetimestamp创建时间
update_timetimestamp更新时间
2、需要的方法
publicinterfaceReportFileServiceextendsIService<UReportFile>{
/**
* 根据报表名称检查报表是否存在
*
*@paramname 报表名称
*/
booleancheckExistByName(String name);
/**
* 根据报表名称查询报表
*
*@paramname 报表名称
*/
UReportFile getReportFileByName(String name);
/**
* 查询全部报表
*/
List<UReportFile>listAllReportFile();
/**
* 根据报表名称删除报表
*
*@paramname 报表名称
*/
booleanremoveReportFileByName(String name);
/**
* 保存报表
*/
booleansaveReportFile(UReportFile entity);
/**
* 更新报表
*/
booleanupdateReportFile(UReportFile entity);
}
3、自定义报表存储器
@Component
@Setter
publicclassMySQLProviderimplementsReportProvider {
/**
* 存储器名称
*/
privatestaticfinalString NAME = "mysql-provider";
/**
* 报表文件名前缀
*/
privateString prefix = "mysql:";
/**
* 是否禁用
*/
privatebooleandisabled =false;
@Autowired
privateReportFileService reportFileService;
/**
* 根据报表名加载报表文件
*
*@paramfile 报表名称
*@return返回的InputStream
*/
@Override
publicInputStream loadReport(String file) {
UReportFile reportFile=reportFileService.getReportFileByName(getCorrectName(file));
ByteArrayInputStream stream=null;
if(ObjectUtil.isNotEmpty(reportFile)) {
try{
stream=newByteArrayInputStream(reportFile.getContent());
}catch(Exception e) {
thrownewReportException(e);
}
}
returnstream;
}
/**
* 根据报表名,删除指定的报表文件
*
*@paramfile 报表名称
*/
@Override
publicvoiddeleteReport(String file) {
reportFileService.removeReportFileByName(getCorrectName(file));
}
/**
* 获取所有的报表文件
*
*@return返回报表文件列表
*/
@Override
publicList<ReportFile>getReportFiles() {
List<UReportFile> list =reportFileService.listAllReportFile();
List<ReportFile> reportList =newArrayList<>();
for(UReportFile file : list) {
reportList.add(newReportFile(file.getName(), file.getUpdateTime()));
}
returnreportList;
}
/**
* 保存报表文件
*
*@paramfile 报表名称
*@paramcontent 报表的XML内容
*/
@Override
publicvoidsaveReport(String file, String content) {
file=getCorrectName(file);
reportFile=reportFileService.getReportFileByName(file);
if(ObjectUtil.isEmpty(reportFile)){
reportFile=newUReportFile();
reportFile.setName(file);
reportFile.setContent(content.getBytes());
reportFileService.save(reportFile);
}else{
reportFile.setContent(content.getBytes());
reportFileService.updateReportFile(reportFile);
}
}
/**
*@return返回存储器名称
*/
@Override
publicString getName() {
returnNAME;
}
/**
*@return返回是否禁用
*/
@Override
publicbooleandisabled() {
returndisabled;
}
/**
*@return返回报表文件名前缀
*/
@Override
publicString getPrefix() {
prefix;
}
/**
* 获取没有前缀的文件名
*
*@paramname 报表名称
*/
privateString getCorrectName(String name){
if(name.startsWith(prefix)){
name=name.substring(prefix.length());
}
returnname;
}
}
启动项目,查看效果
点击链接查看:https://app.yinxiang.com/fx/348c33c0-b404-409d-a7d9-724d418257bd