轉載: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>
其他的我暫時想不起來了