20:45
JasperReport
JasperReport提供很多服务,其中我们常用的是JasperReports Liberary,众多产品中的一员。
JasperReport还提供报表服务器产品、ETL产品、报表工具Studio产品、Ireports Designer产品。
JasperReport还提供多种数据交换工具,如Hadoop Connector、JasperMobile for Android。
JasperReportsLiberary源码下载
1、http://community.jaspersoft.com
IReport加载环境变量
场景
在制作报表的时候少不了对传递过来的报表数据进行转换(比如将金额转换成3位一逗),这时我们可以使用Java封装出对数据进行转换的类,然后在IReport中调用。
操作
IReport中行的浮动
场景
制作一个报表模板包含columnHeader、detail、columnFooter三个区域,其中detail区域中的数据是循环的,然后因为数据不多造成detail与columnFooter区域出现间隔。
解决办法
需要配置columnFooter为浮动,这样columnFooter与detail的间距就变成动态的了。
IReport列的扩展
场景
报表有多行多列,其中同一行的某些列内容太大需要换行,换行后需要当前行的单元格统计调整高度,在润乾中有单元格跟随扩展的机制,在IReport中需要设置
但不是每个单元格都设置,只需要对出现间隔段的单元格设置成
Ireport#Java调用API打印传数据的规则
场景
jsp查询页==>jsp数据呈现页,该页中有原始数据Bean和[打印]按钮==>点击[打印]按钮==>跳转allReport.jsp==>从request#Session中取数据Bean,适配为报表API可用的数据格式对象,调用报表打印API,报表流转储。
分析
报表API之外数据的流转主要是Request、Session、JSP传递的,这些比较简单,在这些数据要传入报表API时就有些特定的规则,报表API提供了数据结构的封装接口,所有数据提供者必须实现API定义的规范才可以。
图示
示例代码
public class JasperDataSource implements JRDataSource {
private Collection dataBeans;
private Object currBean;
private Iterator iterator;
public void setDataBeans(Collection dataBeans) {
this.dataBeans = dataBeans;
iterator = this.dataBeans.iterator();
}
public boolean next() throws JRException {
if (iterator.next()) {
currBean = iterator.next();
return true;
}
return false;
}
public Object getFieldValue(JRField field) throws JRException {
String fieldName = field.getName();
if (currBean instanceof java.util.Map) {
return ((java.util.Map) currBean).get(fieldName);
}
return null;
}
}
JasperReport#报表编译
编译涉及到的实例
net.sf.jasperreports.engine.JasperReportsContext | 上下文 |
srcDir | jrxml目录 |
destDir | 编译后的成果物输出目录 |
tempDir | 临时目录 |
net.sf.jasperreports.engine.JasperCompileManager | 封装报表编译、转储,对外部提供简单的报表编译API |
示例
import java.io.File;
import java.io.FileFilter;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.SimpleJasperReportsContext;
import net.sf.jasperreports.engine.design.JRCompiler;
/**
* 编译报表
* @author WangYanCheng
* @version 2013-3-29
*/
public class CompileReport {
/***/
private File jrxmlFile;
private File jasperFile;
private static File tmpFile = new File("D:\\compileReportTemp");
private static File jarPath = new File("D:\\jasper\\jars");
/**
* 构造方法
* @param jrxmlFile 原始报表描述文件
* @param jasperFile 编译报表后输出文件
*/
public CompileReport(File jrxmlFile, File jasperFile) {
this.jrxmlFile = jrxmlFile;
this.jasperFile = jasperFile;
if (!tmpFile.exists()) {
tmpFile.mkdir();
}
}
/**
* 入口
*/
public void doWork() {
JasperReportsContext jasperReportsContext = new SimpleJasperReportsContext();
jasperReportsContext.setProperty(JRCompiler.COMPILER_TEMP_DIR, tmpFile.getAbsolutePath());
jasperReportsContext.setProperty(JRCompiler.COMPILER_KEEP_JAVA_FILE, "true");
jasperReportsContext.setProperty(JRCompiler.COMPILER_CLASSPATH, getClassPath());
try {
JasperCompileManager.getInstance(jasperReportsContext).compileToFile(jrxmlFile.getAbsolutePath(), jasperFile.getAbsolutePath());
} catch (JRException e) {
e.printStackTrace();
}
}
/**
* 报表编译所需环境变量
* @return classpath 环境变量
*/
public String getClassPath() {
StringBuffer sbuf = new StringBuffer(".;");
File[] libFile = scanFile(jarPath, ".*jar$");
for (File pathItem : libFile) {
sbuf.append(pathItem.getAbsolutePath()).append(";");
}
return sbuf.toString();
}
/**
* 文件扫描,取给定格式匹配的文件
* @param dirFile 目录
* @param expStr 匹配表达式
* @return 文件组
*/
private File[] scanFile(File dirFile, final String expStr) {
File[] rtnFile = null;
if (dirFile.isDirectory()) {
rtnFile = dirFile.listFiles(new FileFilter() {
@Override
public boolean accept(File fileInst) {
return fileInst.getName().matches(expStr);
}
});
}
return rtnFile;
}
/**
* 测试入口
* @param args 参数列表
*/
public static void main(String[] args) {
File srcFile = new File("D:\\jasper\\HelloJasper.jrxml");
File destFile = new File("D:\\jasper\\HelloJasper.jasper");
CompileReport cpInst = new CompileReport(srcFile, destFile);
cpInst.doWork();
}
}