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 [email protected] * */ 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为存放汇总数据,之后最后一页才会出现。