jasperreport的开发,有两种方式,第一种为动态的创建报表,所谓动态,即在程序运行过程中,根据需要由程序定义出相应的模板,该种方式为更灵活,需要什么就创建什么,具有动态性和不确定性;第二种则是根据事先准备好的模板,根据之前的设定,忘模板中填充数据,该种方式具有确定性,在处理上速度也会更佳,因为事先准备好模板,事先编译完成,只需要往其中填充进数据,导出即可,省去的前面的设计和编译环节。第二种方式,采用较多的是使用拖拽工具进行设计,本章以及后续都采用iReport。
使用iReport开发,事先需要准备好JAVA环境,目前最新版本为iReport-5.6.0。注意该版本目前不支持JDK8,需要JDK6或者7才能运行。安装完之后,可以根据情况设计一个简单的报表。本文主要讲述几个部分的占用空间,所以设计了如下的模板:
具体的xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="hello" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="761ac2a3-d6ed-4a5e-b00e-0a42c96858b3">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<parameter name="detail" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="35" splitType="Stretch">
<staticText>
<reportElement x="211" y="5" width="113" height="30" forecolor="#000099" uuid="d91ed968-d7fd-4c2a-9a14-bdba82d2cea3"/>
<textElement>
<font size="16" isBold="true"/>
</textElement>
<text><![CDATA[This is Title]]></text>
</staticText>
<textField pattern="yyyy/MM/dd">
<reportElement x="24" y="15" width="100" height="20" uuid="f611afbf-084f-4d62-8207-aa847d9f850d"/>
<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="35" splitType="Stretch">
<staticText>
<reportElement x="171" y="4" width="203" height="28" forecolor="#CC00CC" uuid="e58f784d-76e9-49c9-b0e4-f415bef975ba"/>
<textElement>
<font size="15" isBold="false"/>
</textElement>
<text><![CDATA[This is PageHeader]]></text>
</staticText>
</band>
</pageHeader>
<columnHeader>
<band height="61" splitType="Stretch">
<staticText>
<reportElement x="171" y="15" width="169" height="26" forecolor="#FF6633" uuid="50c197ee-1c4d-44f5-8287-89a190518f41"/>
<textElement>
<font size="15"/>
</textElement>
<text><![CDATA[This is ColumnHeader]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="125" splitType="Stretch">
<textField isStretchWithOverflow="true">
<reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="555" height="125" forecolor="#003333" uuid="5a46fe2b-d19b-4ac3-8085-c6a9d7784c29"/>
<textElement>
<font size="13"/>
</textElement>
<textFieldExpression><![CDATA[$P{detail}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch">
<staticText>
<reportElement x="176" y="10" width="169" height="26" forecolor="#FF6600" uuid="0014b3a9-92c0-470e-9772-e6b58b291dce"/>
<textElement>
<font size="15"/>
</textElement>
<text><![CDATA[This is ColumnFooter]]></text>
</staticText>
</band>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch">
<staticText>
<reportElement x="177" y="-38" width="203" height="28" forecolor="#990099" uuid="aa93eaad-d095-48fa-9716-20a82f5b0049"/>
<textElement>
<font size="15"/>
</textElement>
<text><![CDATA[This is PageFooter]]></text>
</staticText>
<staticText>
<reportElement x="211" y="12" width="163" height="20" forecolor="#009999" uuid="c1722fde-c190-4b8e-9742-403b014d9961"/>
<textElement>
<font size="13"/>
</textElement>
<text><![CDATA[this is summary]]></text>
</staticText>
</band>
</summary>
</jasperReport>
测试的代码如下:
package com.zzq.test.jasperreport.hello;
import java.io.File;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleXlsReportConfiguration;
/**
* 第一个jasperreport程序,通过例子说明title、pageHeader、pageFooter、Detail、ColumnHeader、ColumnFooter、Summary的结构关系
* @author zzq0324@qq.com
*
*/
public class HelloJasper {
/** 前缀 */
private static final String PREFIX = File.separator + "hello" + File.separator + "hello";
/** classpath所在的目录 */
private static File DIR = null;
/**
* 初始化当前类所在的编译目录
*/
static {
try {
DIR = new File(HelloJasper.class.getResource("/").toURI());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
/**
* 将jrxml编译成jasper的格式,并保存在classpath目录下
* @return
* @throws Exception
*/
public static void compile() throws Exception {
JasperCompileManager.compileReportToFile(DIR + PREFIX + ".jrxml");
}
/**
* 将数据填充到编译后的jasper,重新生成一个jrprint的文件
* @throws Exception
*/
public static void fillData() throws Exception {
Map<String, Object> params = new HashMap<String, Object>();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 1000; i++) {
buffer.append("test" + i);
}
params.put("detail", buffer.toString());
//此处不能直接用JasperFillManager.fillReportToFile(DIR + PREFIX + ".jasper", params)调用,需要多传一个JREmptyDataSource,否则导出的文件有问题,具体PDF空白,excel文件有问题
JasperFillManager.fillReportToFile(DIR + PREFIX + ".jasper", params, new JREmptyDataSource());
}
/**
* 将报表导出成pdf
* @throws Exception
*/
public static void printPDF() throws Exception {
JasperPrint jasperPrint = (JasperPrint) JRLoader.loadObject(new File(DIR + PREFIX + ".jrprint"));
File destFile = new File(DIR + PREFIX + ".pdf");
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(destFile));
exporter.exportReport();
}
/**
* 打印成excel文件
* @throws Exception
*/
public static void printXls() throws Exception {
JasperPrint jasperPrint = (JasperPrint) JRLoader.loadObject(new File(DIR + PREFIX + ".jrprint"));
File destFile = new File(DIR + PREFIX + ".xls");
JRXlsExporter exporter = new JRXlsExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(destFile));
SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
configuration.setOnePagePerSheet(false);
exporter.setConfiguration(configuration);
exporter.exportReport();
}
public static void main(String[] args) throws Exception {
compile();
fillData();
printPDF();
printXls();
}
}
运行之后,会生成相应的pdf和xls。通过观察生成的PDF,可以总结出:
1、title为报表的标题,整个报表内只会出现一次;
2、PageHeader和PageFooter,页面的头部和尾部,根据生成的PDF发现,PageHeader在每页都会存在,而PageFooter则只在最后一页存在,目前不知道这个原因;
3、ColumnHeader和ColumnFooter将Detail夹在中间,每个页面都会出现;
4、Summary为存放汇总数据,之后最后一页才会出现。