反饋已提交
網絡繁忙
定義了儲存格後,有時候我們需要對報表每個儲存格進行處理,如何在程式中遍歷儲存格呢?
FineReport 中透過 Report 的 cellIterator() 方法獲取 Report 中所有的儲存格,這些儲存格放在 Iterator 中,可以像遍歷普通的 Iterator 物件一樣遍歷 Iterator 中的儲存格,進而對儲存格進行處理或作其他操作。
1)獲取報表
遍歷儲存格前我們需要獲取儲存格所在的容器 Report,我們以 分組報表.cpt 為例,如下所示:
// 讀取範本儲存為WorkBook物件 workbook = TemplateWorkBookIO.readTemplateWorkBook("//doctw//Primary//GroupReport//分組報表.cpt");
2)遍歷儲存格
// 遍歷儲存格 int col = 0, row = 0;byte direction = 0;java.util.Iterator it = report.cellIterator();while (it.hasNext()) { TemplateCellElement cell = (TemplateCellElement) it.next(); // 獲取儲存格的列號與欄號並互換 col = cell.getColumn(); row = cell.getRow(); cell.setColumn(row); cell.setRow(col); // 獲取原儲存格的擴展方向,0表示縱向擴展,1表示橫向擴展 direction = cell.getCellExpandAttr().getDirection(); if (direction == 0) { cell.getCellExpandAttr().setDirection((byte) 1); } else if (direction == 1) { cell.getCellExpandAttr().setDirection((byte) 0); } // 將改變後的儲存格新增進新的WorkSheet中 newworksheet.addCellElement(cell);}
如下透過遍歷儲存格實現報表根據不同的參數值實現列欄切換。如下圖所示:
編譯程式前,需先建立一個 Java 工程環境,並且需要一個 Java 編輯器,如 Eclipse 或 idea 。
在編輯器工程中匯入 FineReport 工程 JAR 包。包括使用者自己報表工程
%FR_HOME%/lib下的所有的包,
%FR_HOME%/server/lib 下的所有包,
%FR_HOME%/webapps/webroot/WEB-INF/lib下的所有包,
還要引入 JDK 下的 tools.jar。詳細操作可參考:編譯Java程式
通程式式報表實現,原 分組報表.cpt 如下,當輸入變數需要列欄轉換時,則遍歷儲存格,將儲存格的列號與欄號互換即可。
將該範本讀入程式,根據傳入的參數 change 的值來進行橫縱向控制
當 change 沒有值或者值為 0 時,為原顯示效果;
當 change 值為1,則切換報表列與欄,最後轉為網路報表。
在編輯器中編寫 Java 程式 ChangeRowAndCol.java,其中實現不同參數值不同的報表呈現方式。
完整程式碼可參見:
注:修改 Java ,重新編譯生成 class ,取代原有 class 後,必須重啟工程才能生效,否則一直都是展示原來的範本。
//遍歷儲存格package com.fr.demo;import com.fr.io.TemplateWorkBookIO;import com.fr.main.TemplateWorkBook;import com.fr.report.cell.TemplateCellElement;import com.fr.report.elementcase.TemplateElementCase;import com.fr.report.worksheet.WorkSheet;import com.fr.web.core.Reportlet;import com.fr.web.request.ReportletRequest;import java.util.Map;public class ChangeRowAndCol extends Reportlet { public TemplateWorkBook createReport(ReportletRequest reportletrequest) { // 定義最終需要傳回的WorkBook物件 TemplateWorkBook workbook = null; WorkSheet newworksheet = new WorkSheet(); String change = "0"; try { // 讀取範本儲存為WorkBook物件 workbook = TemplateWorkBookIO.readTemplateWorkBook("//doctw//Primary//GroupReport//分組報表.cpt"); // 讀取請求中的參數判斷是否需要切換列欄顯示,0表示不切換,1表示切換 if (reportletrequest.getParameter("change") != null) { change = reportletrequest.getParameter("change").toString(); } if (change.equals("1")) { // 獲得儲存格需要首先獲得儲存格所在的報表 TemplateElementCase report = (TemplateElementCase) workbook .getTemplateReport(0); // 遍歷儲存格 int col = 0, row = 0; byte direction = 0; java.util.Iterator it = report.cellIterator(); while (it.hasNext()) { TemplateCellElement cell = (TemplateCellElement) it.next(); // 獲取儲存格的列號與欄號並互換 col = cell.getColumn(); row = cell.getRow(); cell.setColumn(row); cell.setRow(col); // 獲取原儲存格的擴展方向,0表示縱向擴展,1表示橫向擴展 direction = cell.getCellExpandAttr().getDirection(); if (direction == 0) { cell.getCellExpandAttr().setDirection((byte) 1); } else if (direction == 1) { cell.getCellExpandAttr().setDirection((byte) 0); } // 將改變後的儲存格新增進新的WorkSheet中 newworksheet.addCellElement(cell); } // 取代原sheet workbook.setReport(0, newworksheet); } } catch (Exception e) { e.printStackTrace(); } return workbook; } @Override public void setParameterMap(Map arg0) { // TODO Auto-generated method stub } @Override public void setTplPath(String arg0) { // TODO Auto-generated method stub }}
Java 程式編寫完成後,在編譯器中編譯 ChangeRowAndCol.java ,編譯透過後,將會在編譯器對應工程檔案儲存路徑下生成 ChangeRowAndCol.class 類檔案。如下圖所示:
點選下載 class 檔案:ChangeRowAndCol.zip
將編譯後的 ChangeRowAndCol.class 放到報表工程 %FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\demo目錄下。如下圖所示:
啟動伺服器,在瀏覽器中輸入存取報表工程檔案的路徑,如使用本地設計器工程,啟動後在瀏覽器端輸入http://localhost:8075/webroot/decision/view/report?viewlet=com.fr.demo.ChangeRowAndCol便可以預覽報表。如下圖所示:
瀏覽器地址中新增參數 &change=1 ,修改地址如下:
http://localhost:8075/webroot/decision/view/report?viewlet=com.fr.demo.ChangeRowAndCol&change=1,結果如下圖所示:
這樣,報表列欄切換就實現了。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙