iReport+jasperreport的第一個報表

      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

相關文章
相關標籤/搜索