常用的幾大報表技術:POI 、Itext、jasperreport技術,本篇以jasperreport爲例。
Jasperreport:
jasperreport是一個強大的、靈活的報表生成工具,能夠展示豐富的頁面內容,並將之轉換成 PDF、HTML或者xml格式等。
該庫完全是由java編寫,可以用於各種java應用程序,包括javaee,web應用程序中生成動態內容。
jasperreport是開源的,但是文檔是收費的,它還有一個開源的工程IRepoet,Ireport是一個圖形化的輔助工具,能彌補jasperreport的缺點,jasperreport僅提供了可使用的類庫。
IReport:
iReport的刪除格式,支持PDF、HTML、CSV、java2d、Excel、純文字、JRViewer,其中最常用的是PDF、JRViewer
報表模板的結構:
Title:報表的標題,如有多頁只有一個標題
Page Header :每頁報表數據的頁頭
Cloumn Header:數據的列頭
Detail:顯示數據的內容
Column Footer:表格頁腳
PageFooter:頁腳
Summarg:摘要
常用的報表組件
Static Text : 靜態的文本
TextField :顯示動態的文本
設置預覽的格式 -- PDF
Irerot :配置數據庫的連接,基於報表生成
1,字段的創建
點擊Next之後,進行鏈接那個數據庫
數據庫爲紅色表示沒有改驅動,需要加入該驅動
連接完成數據庫之後,然後可以直接對數據庫進行使用sql語句直接查詢
在使用sql語句查詢的時候,可以使用參數來傳遞條件表達式中的參數
select * from 表名 where = $P{PojectName} order by pronname
1,2方式二
右鍵創建
重命名:
創建完成之後,將創建的字段 添加到Datail 1中 此時會在Column Header中出現你要設置的對應的字段的名字
可以對指定的字段進行屬性的設置
1.3使用 javabean的形式創建Field
選擇的目錄是當前javabean所在的工程路徑下編譯後的class文件所在的目錄。
2.參數
通常是用來在打印的時候從程序裏的傳值到報表裏,也就是說參數通常的是其參數傳遞的作用,在使用的時候,一般是用來將數據放在map中設置key和value兩個參數,key就是對應的報表中的參數,參數的類型是java中的Object類型,所以可以傳遞任意的類型。
在使用參數的時候,格式是:$P{parameter name}
在程序中將參數傳遞到報表中:
1,創建一個Map集合,將要顯示的數據封裝到map集合中,如果是多個對象類型的,主要對象中的屬性值要跟報表中的參數的名稱一致,將對象放進map集合中即可
2,創建JaperFillManager.fillReport(fileName,hm,new JREmptyDataSource());方法
fileName : 參數表示的是:根據報表模板生成的模板對象
hm : 表示的map集合
new JREmptyDataSource() : 表示的數據源 -- 如果是對象顯示數據的時候,將查詢出的數據當參數傳遞(從數據庫中查詢的數據)
@RestController
public class Demo01 {
@Autowired
ServletContext context;
@RequestMapping(value = "/hello")
public void report() throws IOException, JRException {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes attributes1 = (ServletRequestAttributes) attributes;
HttpServletRequest request = attributes1.getRequest();
HttpServletResponse response = attributes1.getResponse();
// 獲取全局參數
// WebApplicationContext context =
// ContextLoader.getCurrentWebApplicationContext();
// ServletContext servletContext = context.getServletContext();
// 設置下載的類型
response.setContentType("application/pdf");
// 獲取當前瀏覽器的類型
String header = request.getHeader("user-agent");
// 設置頭信息,設置下載的中文亂碼的問題
String s = FileUtils.encodeDownloadFilename("報表.pdf", header);
// 設置點擊下載的時候下載的文件名稱
response.setHeader("Content-Disposition","attachmnet;filename"+s);
// 獲取IRrport的路徑 的全路徑
// String realPath = context.getRealPath("ReportDemo/src/main/resources/jasper/report1.jrxml");
String realPath = this.getClass().getClassLoader().getResource("jasper/Ieport.jrxml").toString();
System.out.println(realPath);
// 根據給的IReport的模板,生成IRrport的對象
JasperReport jasperReport = JasperCompileManager.compileReport(realPath);
HashMap<String, Object> map = new HashMap<>();
map.put("name","李四");
map.put("age","20");
map.put("sex","男");
// 將數據和地址綁定在一起 因爲爲沒有設置數據源,所以傳入null
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, new JRBeanCollectionDataSource(null));
JRPdfExporter pdfExporter = new JRPdfExporter();
// 設置對象的輸出 格式爲PDF 的格式
JRPdfExporter jrPdfExporter = new JRPdfExporter();
// 設置 數據
jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT,null);
// 將結果放進流中,進行輸出
jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,response.getOutputStream());
// 執行導出
jrPdfExporter.exportReport();
}
}
常用的三個參數 (拿sql舉例):
select id ,count from a where id = idstr;(idstr表示傳遞的數據)
$F{id}:即顯示以上sql查詢的id值 用於數據的顯示
$P{idstr} :即顯示傳進來的參數值
$V{sumCunt} 即求和的count 列的值,並顯示