动态报表
BaskReport的模板文件是以xml存储到数据库的,实现动态报表的关键是在预览报表的时候我们可以提供自定义的xml给报表渲染器,让报表根据我们提供的模板和数据展示报表。
步骤如下:
- 实现自定义FileLoader扩展loadContent方法
- 拦截默认的报表预览请求,并将需要实现动态报表的报表文件的缓存关闭
实现自定义的FileLoader
如类:com.basksoft.baskreport.demo.dynaview.MockFileLoader
将该类通过SPI配置文件配置到项目中:

然后定义这个类,我们让这个类继承BaskServer默认提供的com.basksoft.core.database.service.file.DefaultFileLoader;
public class MockFileLoader extends DefaultFileLoader {
// 返回模板文件对应的xml脚本
public String loadContent(long fileId) {
String content;
// 获取当前上下文中对应的报表模板文件
FileIdentity identity = ContextHolder.getFile();
BaskFile baskFile = identity.getBaskFile();
// 判断是否模板
boolean isTemplate = //TODO: 自行实现判断是否模板文件
if (isTemplate) {
content = // TODO: 自行实现返回模板对应的XML脚本
} else {
content = super.loadContent(fileId);
}
return content;
}
}
拦截默认的分页预览
如类: com.basksoft.baskreport.demo.dynaview.MockPageServletHandler
将该类通过SPI配置文件配置到项目中:
然后定义这个类,我们让这个类继承BaskServer默认提供的com.basksoft.report.console.report.preview.PageServletHandler;
public class UserPageServletHandler extends PageServletHandler {
@Override
@BaskAuthFile()
public void execute(BaskServletRequestWrapper req, BaskServletResponseWrapper resp) {
FileIdentity identity = ContextHolder.getFile();
try {
//获取模板文件
BaskFile baskFile = identity.getBaskFile();
boolean isTemplate = //TODO: 自行实现判断是否模板文件
if (isTemplate) {
baskFile.setModifyDate(new Date());// 确保不使用默认的缓存,触发FileLoader的getContent()获取报表模板
}
super.execute(req, resp);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}