动态报表

BaskReport的模板文件是以xml存储到数据库的,实现动态报表的关键是在预览报表的时候我们可以提供自定义的xml给报表渲染器,让报表根据我们提供的模板和数据展示报表。

步骤如下:

  • 实现自定义FileLoader扩展loadContent方法
  • 拦截默认的报表预览请求,并将需要实现动态报表的报表文件的缓存关闭

实现自定义的FileLoader

如类:com.basksoft.baskreport.demo.dynaview.MockFileLoader 将该类通过SPI配置文件配置到项目中: FileLoader

然后定义这个类,我们让这个类继承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配置文件配置到项目中: ServletHandler 然后定义这个类,我们让这个类继承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);
        }
    }
}

results matching ""

    No results matching ""