今天来说一个使用ireport进行报表打印的实例。打印的模板绘制如下图:
对于模板的简单解释:
(1)这个报表打印模板分两部分:page Header域和Detail域
(2)其中固定文本,我采用的是组件Static text,字体采用的是宋体,加粗采用的是微软雅黑字体。
(3)$F{field}是动态显示的文本,采用的是组件TextField。对于这些field,我在报表绘制的左侧的field中添加对应的实体属性名,这些属性名也与我java后台打印的vo中的属性名字保持一致。
(4)表格是通过组件Line来画出来的。
相关代码展示:
(1)JSP中的打印相关代码如下所示:
function daYin(){
//前端框架我们采用的miniUI,所以在点击打印按钮的时候,我们必须先校验一下是否有数据可以打印,如果没有数据,我们就会给出相应的警告!
var allsize= grid.getTotalCount();
if(allsize <= 0){
mini.alert("无数据可以打印");
return false;
}
//打印时,传相应的查询数据条件进行后台查询对应的数据。
var ksnd= mini.get("qsrqS").getValue();
var jsnd = mini.get("qsrqE").getValue();
var ksjd = mini.get("jd1").getValue();
var jsjd = mini.get("jd2").getValue();
var ssqx = mini.get("qx").getValue();
var gxjg = mini.get("jg").getValue();
//我们将查询条件拼接为一个字符串,然后去后台进行处理
var str = ksnd+','+ ksjd+','+ jsnd+','+ jsjd+','+ ssqx+','+ gxjg;
//执行后台打印逻辑
var printActionUrl =" ${ctx}/printTjbbEtmz/print?str="+str;
//将后台打印的逻辑查询的数据显示在打印预览界面
printActionUrl = encodeURIComponent(printActionUrl);
var action="${ctx}/common/daYin?printActionUrl="+printActionUrl;
mini.open({
url: action,
//设置打印预览界面的高度和宽度
title: "儿童门诊打印", width: 810, height: 630,
ondestroy: function (action) {
search();
}
});
}
}
encodeURIComponent = function(uriComponent) {};//EcmaScript中的js方法
采用的是SSM,后台的处理逻辑如下所示
@RequiresUser
@RequiresPermissions("权限标识符")
@RequestMapping(value = "print",method = RequestMethod.POST)
@ResponseBody
public void print(HttpServletRequest request,HttpServletResponse response){
//接收查询条件参数
String str = request.getParameter("str");
String[] array = str.split(",");
String ssqx = null;
String gxjg = null;
if(array.length == 6){//参数全传
ssqx = array[4];
gxjg = array[5];
}else if(array.length == 5){
ssqx = array[4];
}
String kssj = array[0]+array[1];
String jssj = array[2]+array[3];
//查询打印数据
List<PrintTjbbEtmzVo> printList = printTjbbEtmzService.query(kssj,jssj,ssqx,gxjg);
//对于年度和季度的业务处理
for(int i=0;i<printList.size();i++){
if(Integer.parseInt(array[0]) == Integer.parseInt(array[2])){
printList.get(i).setNf(array[0]+"年");
if(Integer.parseInt(array[1]) == Integer.parseInt(array[3])){
printList.get(i).setJd("第"+array[3]+"季度");
}else{
printList.get(i).setJd("第"+array[1]+"-"+array[3]+"季度");
}
}else{
printList.get(i).setNf(array[0]+"-"+array[2]+"年");
printList.get(i).setJd("第"+array[1]+"-"+array[3]+"季度");
}
//对于填报单位的处理
printList.get(i).setTbdw(FnsUtils.getHospitalByCode(FnsUtils.getUser().getOrgCode())+"(盖章)");
//空值处理,避免界面打印出来null这样的空值
dealWithNull(printList.get(i));
}
//调用打印方法,传入三个参数,list,封装的数据,第二个参数是你打印模板的名字,后面两个参数分别是request和response.
PrintUtil.print(printList, "printEtmz.jrxml", request, response); //打印数据
}
对于空值的处理,
(1)前面一篇文章说过,可以采用在模板中绘制的时候将TextField组件的属性print when null勾选,这样如果是null的话,就会自动将null处理掉,并且界面就不会显示null这样的值
(2)或者在JAVA后台进行处理null值,代码如下所示:
private void dealWithNull(PrintTjbbEtmzVo printTjbbEtmzVo) {
if (printTjbbEtmzVo.getDwfzr() == null){
printTjbbEtmzVo.setDwfzr("");
}
}
后台的相关SQL就不展示了,打印的共通方法会在打印相关总结完以后来写另外一篇博文。
总结:
1、这个打印是一种情况,画一个简单的报表模板进行打印
2、主要采用了组件是Line,TextField和Static text,字体加粗采用的是微软雅黑字体
3、对于空值null的处理及打印前台后的交互