JAVA调用IReport模板生成PDF文件及常见的几个问题解决
转载:http://cache.baiducontent.com/c?m=v14RCBGrkK42yz2FeanXqBoajYiAJ_4DRfR4Nf4hLHBWypeB9bh7NcTa1kmpVXg4BJ3p8xYUEVVoCpe4uaQyv7Bg_Ve0PgPHceNv6yNBw8uuwZ0LI9qiNQSdHZtCFqlfK5ZAweI7EciLEB12Pc6cxKuL3Zab9LlzThf9CQucpzarnXAQLFecPUZlHP7hV1GLz5yzQ2m8Fg-nN_m27I_3ba&p=9c638915d9c040a92ab98c2d02148d&newp=8a6ec54ad5c247b70be2966d5c55cf231610db2151d6d4176b82c825d7331b001c3bbfb423291406d8c57d6c00a94a5eebf63777370923a3dda5c91d9fb4c5747990&s=747d392acfc03cab&user=baidu&fm=sc&query=ireport%C4%A3%B0%E5%C9%FA%B3%C9PDF%CE%C4%BC%FE&qid=c3cbbf4a0009d9ab&p1=2
先生成一个空白模板
然后先不要急着拼组件,先来大致了解一下这个工具的使用方法和模板的构造
title:只在报表的第一页显示,后面的就不在显示,常用来放置报表名称。
page header :相当于页眉,在第一页位于title的下面,而后的页中是位于最上部。
page footer :相当于页脚,和page header是想对应的。
detail :报表内容显示的部分,这部分内容是重复的,相当于迭代的过程,常用于放置类似表格中列的内容。
column header :针对Detail Band 的表头段,一般情况下在这个段中画报表的表头,用于放置表头内容
column footer :和column header 相对的。
summary :出现在整个报表的最后一页的detail的下面,统计总值结果。
下面下来做个测试,了解一下这个模板的各个位置,首先把各个构件的高度都调到最高,让这个页面放到最大,如果不放大的话,所有的构件都在同一页上了,看不出来效果,现在我把每个构件的中间都放了一个staticText,写上他们的名字,再把背景图也加上,看下效果,
如果你不知道背景图怎么展开,先点一下构件的名字,然后把属性高度调到最高,也就是802,你就可以看到他了,然后再从组件里拖一个image过来,放一个图片就OK了
然后准备就绪,编译一把,看看效果
共有三页,
第一页:
第二页
第三页:
然后可以总结下,这个title是只在第一页会有,summary是只在最后一页会有,背景图是每一页都有,detail除了第一页和最后一页都有,其他的组件都是除了最后一页都有,然后知道了这些以后就可以按照自己的需求去写这个页面了。
主要就是有个list的遍历循环,我等会儿再写。
list的循环,这里要结合java代码给塞数据
先来看一下塞一个变量怎么塞:
点击效果预览,会提示让你输入这个参数内容
然后就看到了这个参数了
下面我们来看list是怎么搞的。
先建一个list属性的参数,记得已定要改为list格式
然后在dataset1中添加参数和刚才的名称一致
然后生成jasper文件模板以后我用java代码调用一下看看
稍等会儿再写,,
java调用jasper文件demo
使用到的包:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<!-- 生成pdf所依赖的包 -->
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--将.jrxml编译成.jasper.如果你不使用java编译,而使用ireport工具编译则无须导入该 包 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.13</version>
</dependency>
package com.lin.study.test;
import com.lin.study.utils.JasperHelper;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JasperTest {
public static void main(String[] args) throws Exception {
JRDataSource jrDataSource = new JRBeanCollectionDataSource(null);//这个应该是给Jasper转化List的作用
Map testMap=new HashMap();
List<BenzBean> list = new ArrayList<BenzBean>();
BenzBean bean1 = new BenzBean();
bean1.setBenzListParamName("C100");
BenzBean bean2 = new BenzBean();
bean2.setBenzListParamName("C200");
BenzBean bean3 = new BenzBean();
bean3.setBenzListParamName("C300");
list.add(bean1);
list.add(bean2);
list.add(bean3);
testMap.put("benzListParam",list);
testMap.put("benzParam","我是林俊杰");
List jasperPrintList = new ArrayList();
File BenzIReport = new File("D:/iReport/work/jasper/BenzIReport.jasper");
if(BenzIReport.exists()){
JasperReport Benz = (JasperReport) JRLoader.loadObject(BenzIReport);
JasperPrint protocolTemplate = JasperFillManager.fillReport(Benz,testMap,jrDataSource);
jasperPrintList.add(protocolTemplate);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();
byte[] bytes = baos.toByteArray();
File file = new File("D:/iReport/work/benz.pdf");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
System.out.println("写入成功");
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
bean对象
package com.lin.study.test;
public class BenzBean {
private String benzListParamName;
public String getBenzListParamName() {
return benzListParamName;
}
public void setBenzListParamName(String benzListParamName) {
this.benzListParamName = benzListParamName;
}
}
效果如下,我给他放在titile里面展示出来了,放在Detail里面没展示出来,后面我再找找原因
还有这个jasper的数据连接,我之前一直用的Empty,因为我觉得这个无所谓的,我在代码里面查出来给他塞进去是一样的效果,
我这里还是补充一下吧。
如果你是Orcale数据库的话,先准备好这个jar包
链接:https://pan.baidu.com/s/1HJXvEpiuiIQSm_2E747m3g
提取码:uhzo
然后也是拖拖拽拽,这里也不多讲了
常见的问题主要有
1,空白展示为null;
2,文字内容太长,溢出了;
3,中文乱码;
net.sf.jasperreports.awt.ignore.missing.font=true
4,发布到linux服务器中文文字重叠,吃字;
吃字也是字体的问题,因为linux没有安装中文字符集,所以展示中文乱码或者计算字符长度/宽度有问题,导致文字重叠
5,生成pdf空白页问题;
6,commons-digester问题
代码生成pdf的时候会报错少个什么digester/Rule这个类,这是因为少了这个jar包
这个jar包我忘了从哪里搞了,我放在云盘上吧,直接拿去用得了
链接:https://pan.baidu.com/s/1JWboJzpuOu6Ff96xGJ8baA
提取码:u7ml
pom里我是这么写的
<dependency>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
<version>2.1</version>
</dependency>
其他的我暂时想不起来了