首頁 Java java教程 JasperReports庫的基本介紹

JasperReports庫的基本介紹

Jan 04, 2025 pm 02:17 PM

1。簡介
在實踐中,我們看到以某種格式統計和匯出資料的請求是很常見的。例如,我們收到匯出客戶統計報告、銷售發票、採購發票等的請求,這需要人們(尤其是程式設計師)建立軟體,您可以根據每個具體情況和要求靈活建立匯出資料的範本。你可能立刻想到的解決方案是使用Word、Excel…,但這個解決方案不適合大量不斷變化、短時間內發展的數據,同時還需要支付軟體費用和數據處理時間不是最佳的。
目前有一個相當流行的解決方案——許多程式設計師都喜歡使用的JasperReports庫。
特別是,這個庫是開源的,並且有免費版本。您可以存取其原始程式碼:https://github.com/TIBCOSoftware/jasperreports

2。使用說明
關於如何使用這個庫網上有很多說明,這裡就不詳細寫了
如果您使用 Eclipse,JasperReports 有一個額外的外掛程式可以幫助您建立報告範本。
在這篇文章中,我將指導您在IntelliJ IDEA上使用它,庫管理器是maven。
首先,您需要一個範本來填寫資料(如訂單、發票等)。為此,請下載並安裝 Jaspersoft Studio 軟體(最新的社群版本連結目前為 https://community.jaspersoft.com/files/file/19-jaspersoft®-studio-community-edition /?do=getNewComment)。
安裝開啟後,軟體會有以下介面:

Giới thiệu căn bản về thư viện JasperReports

要建立新模板,請前往檔案 ->新->賈斯珀報告。在「全部」部分中,選擇「空白 A4」(或您喜歡的其他範本:>)。

Giới thiệu căn bản về thư viện JasperReports

按一下“下一步”,指定檔案的儲存位置。點選下一步->下一步->結束。出現的新介面是模板介面,您可以根據自己的模板自由設計。

Giới thiệu căn bản về thư viện JasperReports

右邊是函式庫支援的物件。

Giới thiệu căn bản về thư viện JasperReports

假設我必須建立一個帶有標題和商品名稱的簡單購買發票表格。我將“靜態文字”物件拖放到範本中,並輸入名稱“採購發票”(您可以在螢幕右上角自行調整格式)。
接下來,我再拖曳 2 個類似的對象,但將物品類別設定在「書籍」和「鋼筆」下方。
接下來我必須加入這 2 件商品的價格。這個值是動態的,所以我必須在這裡包含一個變數(這也是這個庫的一個非常有趣和靈活的功能)。在大綱部分、參數部分中,右鍵點選並選擇「建立參數」。然後我在右角視窗修改了這個變數的值,變數名為book,資料型別為實數。

Giới thiệu căn bản về thư viện JasperReports

然後我將其拖曳到「Book」標籤旁。與變數“筆”和總量相同。這裡你可以分配的總金額等於變數「book」和「pen」的總和。
完成模板後,它會是這樣的

Giới thiệu căn bản về thư viện JasperReports

您切換到來源選項卡,這是系統將處理的資料。基本上,Jasper Report 將以類似於 XML 的文件格式接收輸入數據,但標籤名稱將由庫預先定義。例如,整個檔案的超類別的開始和結束標記必須是「jasperReport」標記。以下是一些必須注意的模板符號:

  • 「$P{}」:動態加入報表中的數據,可以是鍵值對,可以是資料來源。
  • 「$F{}」:從資料來源新增至報表的複雜資料欄位。
  • “$V{}”:根據現有表達式自動產生資料或手動新增資料。 …… 您可以參考更多資訊(https://www.tutorialspoint.com/jasper_reports/jasper_report_expression.htm)

完成後,您可以開始將此文件複製到您的專案中以填充資料並進行處理。
然後繼續導入以下庫:

    <dependency>
      <groupId>net.sf.jasperreports</groupId>
      <artifactId>jasperreports</artifactId>
      <version>6.21.0</version>
    </dependency>

    <dependency>
      <groupId>net.sf.jasperreports</groupId>
      <artifactId>jasperreports-fonts</artifactId>
      <version>6.21.0</version>
    </dependency>
登入後複製

繼續編寫程式碼匯入檔案並填入資料。

final String outputFilename = "report.pdf";
Files.deleteIfExists(new File(outputFilename).toPath());
InputStream inputStream = Main.class.getResourceAsStream("/report.jrxml");
Map<String, Object> parameters = new HashMap<>();
parameters.put("book", 55000);
parameters.put("pen", 11111.1111);
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);
登入後複製

這裡,因為我們直接填充,所以可以使用Map類別。如果你想從資料來源(Database,...)填入數據,可以參考(https://www.baeldung.com/spring-jasper)。
結果如下

Giới thiệu căn bản về thư viện JasperReports

3。安全編程
因為在渲染這個模板的過程中,庫也會執行其中的函數,所以如果使用者可以自訂模板標籤,攻擊者就會添加可以執行命令的惡意標籤。此錯誤與 SSTI 非常相似。
假設允許使用者直接編輯模板。原始碼如下:

final String outputFilename = "out.pdf";
Files.deleteIfExists(new File(outputFilename).toPath());
String input = "";
String template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<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=\"z\" pageWidth=\"500\" pageHeight=\"1200\" columnWidth=\"270\">\n" + input + "</jasperReport>";
InputStream inputStream = new ByteArrayInputStream(template.getBytes());
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);

登入後複製

攻擊者填入惡意函數來控制系統:

字串輸入=“



<p>結果,命令被執行。文件「out.pdf」包含以下內容:</p>

<p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173597147572303.jpg" class="lazy" alt="Giới thiệu căn bản về thư viện JasperReports"></p>

<p>所以程式設計師也必須小心,不要讓使用者直接在模板中輸入內容。 <br>
另外,該程式庫在舊版中也存在漏洞(<em>CVE-2018-18809、CVE-2022-42889</em>、...),程式設計時應注意使用最新版本並更新。定期。 </p>


          

            
        
登入後複製

以上是JasperReports庫的基本介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

See all articles