反饋已提交

網絡繁忙

遍歷儲存格

1. 概述

1.1 應用場景

定義了儲存格後,有時候我們需要對報表每個儲存格進行處理,如何在程式中遍歷儲存格呢?

1.2 實現原理

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);
}

2. 範例

如下透過遍歷儲存格實現報表根據不同的參數值實現列欄切換。如下圖所示:

Snipaste_2025-06-19_09-44-26.png

2.1 準備編譯環境

編譯程式前,需先建立一個 Java 工程環境,並且需要一個 Java 編輯器,如 Eclipse 或 idea 。

在編輯器工程中匯入 FineReport 工程 JAR 包。包括使用者自己報表工程

%FR_HOME%/lib下的所有的包,

%FR_HOME%/server/lib 下的所有包,

%FR_HOME%/webapps/webroot/WEB-INF/lib下的所有包,

還要引入 JDK 下的 tools.jar。詳細操作可參考:編譯Java程式 

2.2 定義程式網路報表

2.2.1 編寫 Java 程式

通程式式報表實現,原 分組報表.cpt 如下,當輸入變數需要列欄轉換時,則遍歷儲存格,將儲存格的列號與欄號互換即可。

QQ20250619-092658.png

將該範本讀入程式,根據傳入的參數 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

    }
}


2.2.2 編譯 Java 檔案

Java 程式編寫完成後,在編譯器中編譯 ChangeRowAndCol.java ,編譯透過後,將會在編譯器對應工程檔案儲存路徑下生成 ChangeRowAndCol.class 類檔案。如下圖所示:

點選下載 class 檔案:ChangeRowAndCol.zip

Snipaste_2025-06-19_09-27-39.png


2.3 發佈並在 Web 端預覽 

將編譯後的 ChangeRowAndCol.class 放到報表工程 %FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\demo目錄下。如下圖所示:

Snipaste_2025-06-19_09-33-46.png

啟動伺服器,在瀏覽器中輸入存取報表工程檔案的路徑,如使用本地設計器工程,啟動後在瀏覽器端輸入http://localhost:8075/webroot/decision/view/report?viewlet=com.fr.demo.ChangeRowAndCol便可以預覽報表。如下圖所示:

QQ20250619-093920.png

瀏覽器地址中新增參數 &change=1 ,修改地址如下:

http://localhost:8075/webroot/decision/view/report?viewlet=com.fr.demo.ChangeRowAndCol&change=1,結果如下圖所示:

QQ20250619-093942.png

這樣,報表列欄切換就實現了。


附件列表


主題: 二次開發
已經是第一篇
已經是最後一篇
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙