jasperreport的開發,有兩種方式,第一種爲動態的建立報表,所謂動態,即在程序運行過程當中,根據須要由程序定義出相應的模板,該種方式爲更靈活,須要什麼就建立什麼,具備動態性和不肯定性;第二種則是根據事先準備好的模板,根據以前的設定,忘模板中填充數據,該種方式具備肯定性,在處理上速度也會更佳,由於事先準備好模板,事先編譯完成,只須要往其中填充進數據,導出便可,省去的前面的設計和編譯環節。第二種方式,採用較多的是使用拖拽工具進行設計,本章以及後續都採用iReport。java
使用iReport開發,事先須要準備好JAVA環境,目前最新版本爲iReport-5.6.0。注意該版本目前不支持JDK8,須要JDK6或者7才能運行。安裝完以後,能夠根據狀況設計一個簡單的報表。本文主要講述幾個部分的佔用空間,因此設計了以下的模板:windows
具體的xml以下:app
<?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,能夠總結出:測試
一、title爲報表的標題,整個報表內只會出現一次;ui
二、PageHeader和PageFooter,頁面的頭部和尾部,根據生成的PDF發現,PageHeader在每頁都會存在,而PageFooter則只在最後一頁存在,目前不知道這個緣由;this
三、ColumnHeader和ColumnFooter將Detail夾在中間,每一個頁面都會出現;spa
四、Summary爲存放彙總數據,以後最後一頁纔會出現。.net