JAVA調用IReport模板生成PDF文件及常見的幾個問題解決


轉載:http://cache.baiducontent.com/c?m=v14RCBGrkK42yz2FeanXqBoajYiAJ_4DRfR4Nf4hLHBWypeB9bh7NcTa1kmpVXg4BJ3p8xYUEVVoCpe4uaQyv7Bg_Ve0PgPHceNv6yNBw8uuwZ0LI9qiNQSdHZtCFqlfK5ZAweI7EciLEB12Pc6cxKuL3Zab9LlzThf9CQucpzarnXAQLFecPUZlHP7hV1GLz5yzQ2m8Fg-nN_m27I_3ba&p=9c638915d9c040a92ab98c2d02148d&newp=8a6ec54ad5c247b70be2966d5c55cf231610db2151d6d4176b82c825d7331b001c3bbfb423291406d8c57d6c00a94a5eebf63777370923a3dda5c91d9fb4c5747990&s=747d392acfc03cab&user=baidu&fm=sc&query=ireport%C4%A3%B0%E5%C9%FA%B3%C9PDF%CE%C4%BC%FE&qid=c3cbbf4a0009d9ab&p1=2

 

先生成一個空白模板
在這里插入圖片描述

然后先不要急着拼組件,先來大致了解一下這個工具的使用方法和模板的構造
在這里插入圖片描述
title:只在報表的第一頁顯示,后面的就不在顯示,常用來放置報表名稱。
page header :相當於頁眉,在第一頁位於title的下面,而后的頁中是位於最上部。
page footer :相當於頁腳,和page header是想對應的。
detail :報表內容顯示的部分,這部分內容是重復的,相當於迭代的過程,常用於放置類似表格中列的內容。
column header :針對Detail Band 的表頭段,一般情況下在這個段中畫報表的表頭,用於放置表頭內容
column footer :和column header 相對的。
summary :出現在整個報表的最后一頁的detail的下面,統計總值結果。

下面下來做個測試,了解一下這個模板的各個位置,首先把各個構件的高度都調到最高,讓這個頁面放到最大,如果不放大的話,所有的構件都在同一頁上了,看不出來效果,現在我把每個構件的中間都放了一個staticText,寫上他們的名字,再把背景圖也加上,看下效果,
在這里插入圖片描述
在這里插入圖片描述

如果你不知道背景圖怎么展開,先點一下構件的名字,然后把屬性高度調到最高,也就是802,你就可以看到他了,然后再從組件里拖一個image過來,放一個圖片就OK了
在這里插入圖片描述

然后准備就緒,編譯一把,看看效果

共有三頁,
第一頁:
在這里插入圖片描述
第二頁
在這里插入圖片描述
第三頁:
在這里插入圖片描述

然后可以總結下,這個title是只在第一頁會有,summary是只在最后一頁會有,背景圖是每一頁都有,detail除了第一頁和最后一頁都有,其他的組件都是除了最后一頁都有,然后知道了這些以后就可以按照自己的需求去寫這個頁面了。

主要就是有個list的遍歷循環,我等會兒再寫。

list的循環,這里要結合java代碼給塞數據

先來看一下塞一個變量怎么塞:
在這里插入圖片描述
點擊效果預覽,會提示讓你輸入這個參數內容
在這里插入圖片描述
然后就看到了這個參數了
在這里插入圖片描述

下面我們來看list是怎么搞的。
先建一個list屬性的參數,記得已定要改為list格式
在這里插入圖片描述
然后在dataset1中添加參數和剛才的名稱一致
在這里插入圖片描述
在這里插入圖片描述

然后生成jasper文件模板以后我用java代碼調用一下看看

稍等會兒再寫,,

java調用jasper文件demo

使用到的包:
在這里插入圖片描述

<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<!-- 生成pdf所依賴的包 -->
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--將.jrxml編譯成.jasper.如果你不使用java編譯,而使用ireport工具編譯則無須導入該 包 -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.13</version>
</dependency>


package com.lin.study.test;

import com.lin.study.utils.JasperHelper;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JasperTest {

    public static void main(String[] args) throws Exception {

        JRDataSource jrDataSource = new JRBeanCollectionDataSource(null);//這個應該是給Jasper轉化List的作用
        Map testMap=new HashMap();

        List<BenzBean> list = new ArrayList<BenzBean>();
        BenzBean bean1 = new BenzBean();
        bean1.setBenzListParamName("C100");

        BenzBean bean2 = new BenzBean();
        bean2.setBenzListParamName("C200");

        BenzBean bean3 = new BenzBean();
        bean3.setBenzListParamName("C300");
        list.add(bean1);
        list.add(bean2);
        list.add(bean3);
        testMap.put("benzListParam",list);
        testMap.put("benzParam","我是林俊傑");
        List jasperPrintList = new ArrayList();

        File BenzIReport = new File("D:/iReport/work/jasper/BenzIReport.jasper");
        if(BenzIReport.exists()){
            JasperReport Benz = (JasperReport) JRLoader.loadObject(BenzIReport); 
            JasperPrint protocolTemplate = JasperFillManager.fillReport(Benz,testMap,jrDataSource);
            jasperPrintList.add(protocolTemplate);
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        JRPdfExporter exporter = new JRPdfExporter();
        exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
        exporter.exportReport();
        byte[] bytes = baos.toByteArray();

        File file = new File("D:/iReport/work/benz.pdf");

        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bytes);
            System.out.println("寫入成功");
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

bean對象

package com.lin.study.test;

public class BenzBean {

    private String benzListParamName;

    public String getBenzListParamName() {
        return benzListParamName;
    }

    public void setBenzListParamName(String benzListParamName) {
        this.benzListParamName = benzListParamName;
    }
}

效果如下,我給他放在titile里面展示出來了,放在Detail里面沒展示出來,后面我再找找原因
在這里插入圖片描述

還有這個jasper的數據連接,我之前一直用的Empty,因為我覺得這個無所謂的,我在代碼里面查出來給他塞進去是一樣的效果,
我這里還是補充一下吧。

如果你是Orcale數據庫的話,先准備好這個jar包
鏈接:https://pan.baidu.com/s/1HJXvEpiuiIQSm_2E747m3g
提取碼:uhzo
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
然后也是拖拖拽拽,這里也不多講了

常見的問題主要有
1,空白展示為null;
在這里插入圖片描述
2,文字內容太長,溢出了;
在這里插入圖片描述
3,中文亂碼;
在這里插入圖片描述
在這里插入圖片描述

net.sf.jasperreports.awt.ignore.missing.font=true

4,發布到linux服務器中文文字重疊,吃字;

吃字也是字體的問題,因為linux沒有安裝中文字符集,所以展示中文亂碼或者計算字符長度/寬度有問題,導致文字重疊

5,生成pdf空白頁問題;
在這里插入圖片描述
6,commons-digester問題
代碼生成pdf的時候會報錯少個什么digester/Rule這個類,這是因為少了這個jar包
這個jar包我忘了從哪里搞了,我放在雲盤上吧,直接拿去用得了
鏈接:https://pan.baidu.com/s/1JWboJzpuOu6Ff96xGJ8baA
提取碼:u7ml
pom里我是這么寫的

		<dependency>
			<groupId>commons-digester</groupId>
			<artifactId>commons-digester</artifactId>
			<version>2.1</version>
		</dependency>

其他的我暫時想不起來了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM