之前介绍了,springboot集成了ureport的框架代码,下面继续介绍ureport的功能集成
在官网上的介绍可以看出来,我们项目自己需要增加 自定义报表存储器
先查看官网的介绍:官网文档地址为:https://www.w3cschool.cn/ureport/ureport-vpna2h8m.html
如果说你有自己的报表存储器的话,则需要自己重写这个类,下面介绍一下这个接口
InputStream loadReport(String file, Map<String, Object> params);
这是加载报表的方式,因为ureport制作完成之后xml文件的格式,你可以将xml文件上传到自己的阿里云oss,将oss地址保存到自己的数据库中,根据某个主键获取编辑好的xml模板
void deleteReport(String file, Map<String, Object> params);
void saveReport(String file,String content,String type, Map<String, Object> params);
删除和保存xml模板类似,可以删除和保存到oss中
有个地方需要注意一下就是ReportProvider这个接口,ureport默认会有自己的存储器,分别是
FileReportProvider 和 ClasspathReportProvider,这两个存储器的具体介绍可以查看官网,但是在真实的生产中基本不会使用,一般都会默认的存储器
如果说报表中有上传图片,并且图片没有自己的存储的方式的话,那么重写完自定义报表存储器基本上可以使用了
但是如果图片也存在oss中,那么你还需要重写图片获取方式
ureport提供了一个图片的接口
public interface ImageProvider {
InputStream getImage(String path);
boolean support(String path);
}
ureport默认有3中的图片功能实现类 分别是 DefaultImageProvider , HttpImageProvider,HttpsImageProvider
DefaultImageProvider 是存在项目WEB-INF下面,HttpImageProvider,HttpsImageProvider 都是网络图片,但是真正生产中的话,我们一般都是自己的图片存在自己的图片系统中,那我们就需要自己重写ImageProvider
需要注意的是,你需要将原先3个的boolean support(String path) 改成return false;不然可能会获取不到图片
下面是我们项目中的图片获取方式,仅供参考
public class DocumentImageProvider implements ImageProvider {
private static final Logger logger = LoggerFactory.getLogger(DocumentImageProvider.class);
@Autowired
private IComReportTemplateService comReportTemplateService;
@Override
public InputStream getImage(String path) {
int index = path.indexOf("ossPath=");
String ossPath = path.substring(index + "ossPath=".length());
ossPath = new String(Base64.getDecoder().decode(ossPath));
byte[] content;
try {
content = comReportTemplateService.getByteContent(ossPath);
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw e;
}
return new ByteArrayInputStream(content);
}
/**
* 获取图片大小
*
* @param path
* @return
*/
public byte[] getImageByte(String path) {
int index = path.indexOf("ossPath=");
String ossPath = path.substring(index + "ossPath=".length());
ossPath = new String(Base64.getDecoder().decode(ossPath));
byte[] content;
try {
content = comReportTemplateService.getByteContent(ossPath);
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw e;
}
return content;
}
@Override
public boolean support(String path) {
return true;
}
}
重写图片,那基本上可以完成报表的大部分功能