安装和启动
注意ireport.conf
是在etc目录下,启动不起来把JDK换成1.6版本可用(1.8不行)。
绘制jrxml
见iReport 使用JavaBean作为数据源开发报表(SSM)。
对于左侧Report Inspector栏中的Parameters和Fields,右键就可以添加和重命名,拖拽可以加入图形化面板的指定位置,双击可以修改外显名称。
面板上的new java.util.Date()
可以通过拖拽右侧组件面板-Tools下的Current date来创建。
面板上Summary区的$V{PAGE_NUMBER}
等变量可以在左侧Variables下找到,直接拖拽使用。
编译成jasper文件
编译,在之前保存的工作目录下可以看到生成了.jasper
文件供Java程序使用。
程序
参考了iReport生成pdf文件,不过我已经手动编译好,不需要像这篇中这样在Java程序中编译。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lzh</groupId>
<artifactId>iReportTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.6.0</version>
</dependency>
</dependencies>
</project>
主类
package org.lzh;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
//这个Map用来为报表中的Parameter参数设置值
Map<String, Object> parameters = new HashMap<String, Object>();
//用来存一堆POJO对象的列表
List<Student> students = new ArrayList<Student>();
//添加一些用来生成报表的POJO对象
for (int i = 0; i < 5; i++) {
students.add(new Student(i, "name" + i, "school" + i));
}
System.out.println("---[开始]---");
//开始计时
long startTime = System.currentTimeMillis();
//[1]编译后的jasper文件位置
String jasperFilePath = "D:/WorkSpace/iReport/test.jasper";
//[2]在Map中添加KV对,以用来设置参数
parameters.put("author", "LiuZhiHao");
//[3]传入放置了POJO对象的集合类列表,以建立数据源对象
JRDataSource jrDataSource = new JRBeanCollectionDataSource(students);
try {
//将jasper资源、参数Map、数据源对象整合到一起,形成JasperPrint总资源对象
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFilePath, parameters, jrDataSource);
//字节数组输出流,用于输出成PDF
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//PDF输出工具
JRPdfExporter jrPdfExporter = new JRPdfExporter();
//为输出工具组合插件
jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);//总资源对象
jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, byteArrayOutputStream);//输出字节数组流
jrPdfExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");//编码
//导出,导出结束后会按照参数将结果放在输出字节数组流中
jrPdfExporter.exportReport();
//将其变成字节数组
byte[] bytes=byteArrayOutputStream.toByteArray();
//写出到文件
File file=new File("D:/WorkSpace/iReport/test.pdf");
FileOutputStream fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(bytes);
System.out.println("写入完毕");
fileOutputStream.close();
} catch (JRException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//结束计时
long endTime=System.currentTimeMillis();
System.out.println("---[结束]共用时"+(endTime-startTime)+"---");
}
}
}
Student类
package org.lzh;
public class Student {
private Integer id;
private String name;
private String school;
//getter,setter,全参和无参构造
}
运行结果
报错解决
[1]GroovyEvaluator找不到
报错信息:
java.lang.ClassNotFoundException: net.sf.jasperreports.compilers.GroovyEvaluator
参考这里,可以将jasperreports
版本改成5.6.0
。
[2]BytecodeInterface8找不到
报错信息:
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : new java.lang.Integer(1)
...
Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.BytecodeInterface8
可以将groovy-all
版本改成2.4.7
。
[3]无法解析的Fields
报错信息:
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : name
捣鼓了半天,找到了解决办法。首先在iReport工具中选中左上角文件根:
在右侧属性中,将语言改为Java:
为表头表达式打上双引号,才是正确的表达式。注意表头在Page Header
区,表的内容行才是在Detail 1
区。
重新保存、编译即可。