如何把报表展现的每页数据区关键数据同时入库留备?
需求
如上图,页面展现报表结果的同时,要求把每一页(共 31 页)的“订单 ID”、“雇员 ID”和“订单金额”3 个关键信息备份到其他地方(如入库,用于后期出回执单等使用)。
分析来看,如果报表呈现完,从前端 html 脚本里解析,还是很复杂的,并且加上有分页就更不好处理。再想,报表的发布方式上,报表源类型有 file 及 bean 多种方式,reportBean 会计算报表生成 IReport 对象,我们完全可以拿 IReport 对象处理分页后再依次拿到各页的数据并处理入库。可行,但报表源类型改 reportBean 可能对较多用户实施起来还是有些麻烦了,还没有没更简单的方式?
其实,润乾报表有丰富的 API,比如数据集监听类、报表计算监听类、分页监听类等等,所以对于上面的需求,我们用分页监听类就能轻松处理,分页监听类内有计算好的报表对象及分页后的对象,直接拿分页后对象分别取各页关键信息就 ok 了,且报表发布上,还是直接用 file 报表源,更简单。
具体实现
接下来,结合实例看下如何定义和使用自定义分页监听类。
1、 准备测试报表
注:可见附件“fenyeliubei.rpx”模板文件
2、 定义分页监听类
文档介绍可参考:http://d.raqsoft.com.cn:6999/report/preference/zdyfyjtql74.html
该类定义很简单,实现 IPagerListener 接口即可。
核心代码如下,完整代码参考附件“AreportListener.java”文件
public void afterPage(IReport iReport, PageBuilder pb) {
try {
//获取总页数
int cp = pb.getPageCount();
System._out_.println("cp-报表总页数:"+cp);
String testV = null;
AreportListener te = new AreportListener();
//te.isNumeric(str)
for(int i=1;i<=cp;i++) {
IReport iii = pb.getPage(i);
for(int j=2;j<=iii.getRowCount();j++) {
//获取序号值
testV = iii.getCell(j, 1).getValue().toString();
//判断(根据序号A列) 如果不是数字就不用判断了,数据区判断完了,到报表尾了
if(!te._isNumeric_(testV)) break;
//如果还是数据区, 就获取订单ID、雇员ID、订单金额往外写就行了。
System._out_.println(i+"页:"+j+"行序号:"+testV+"; 订单编号:"+iii.getCell(j, 2).getValue().toString()+"; 雇员ID:"+iii.getCell(j, 3).getValue().toString()+"; 雇员ID:"+iii.getCell(j, 7).getValue().toString());
}
}
} catch (Throwable e1) {
e1.printStackTrace();
}
}
3、 部署自定义监听类
类文件编译后,放到应用的 web-inf/classes 对应目录下就可以,如果是一些不允许这么放的项目(比如 springboot 之类的),可以把编译后的 class 文件打 jar 包,项目里引入 jar 文件就行了。
这里以设计器自带的 demo 环境为例,放到 demo/WEB-INF/classes 下
4、 为报表模板配置 分页监听类
5、 看后台输出
随便截取的两页部分数据,可以看到所需要入库的信息都已提取到,入库或其他保存动作代码实现即可。
这样,我们通过自定义分页监听类就完成了对报表每页关键信息的提取入库操作,该方法简单便捷,对于极特殊的需求,借助丰富的 API 均可轻松解决。
附件 : fenyeJT.zip
对润乾产品感兴趣的小伙伴,一定要知道软件还能这样卖哟性价比还不过瘾? 欢迎加入好多乾计划。
这里可以低价购买软件产品,让已经亲民的价格更加便宜!
这里可以销售产品获取佣金,赚满钱包成为土豪不再是梦!
这里还可以推荐分享抢红包,每次都是好几块钱的巨款哟!
来吧,现在就加入,拿起手机扫码,开始乾包之旅
嗯,还不太了解好多乾?