反饋已提交

網絡繁忙

儲存範本至資料庫

1. 概述

1.1 應用場景

一般製作的範本檔案都放在硬碟中,如果硬碟損壞,就會導致檔案丟失,後果會很嚴重。為了降低這個風險,我們可將範本檔案全部儲存在資料庫中(二進制資料),這樣若是硬碟損壞導致檔案丟失,也可以將資料庫中的備份檔案取出,進而避免發生重大損失。

如下圖所示,這裏是已經將 cpt 範本儲存於 MySQL 資料庫中,點選查詢即可看到儲存的二進制檔案。那麼,如何將 cpt 範本儲存入庫呢?

1641363051GlIS.png

1.2 實現原理

通程式式讀取報表後將其提交入庫。

2. 範例

以下範例讀取內建範本 GettingStarted.cpt 後將其儲存在資料庫表 report 中。

2.1 準備儲存表

資料庫中先建好一張 report 表,表中包含兩個欄位 cptname(字串型)和 cpt(二進制資料類型)。如下圖所示,在MySQL 資料庫中建立表 report。

1553754171Ifi4dnAN.png

2.2 準備編譯環境

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

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

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

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

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

程式碼中會將範本資訊入庫,還需要匯入對應的 JDBC 驅動,

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

2.3 編寫 Java 程式

在編輯器中編寫 Java 程式 SaveReportToDatabase.java,即讀取內建範本 GettingStarted.cpt 後將其儲存在資料庫表 report 中。完整程式碼可參見:

注1:該程式中使用了 JDBC 連結資料庫,2.2 節匯入 JAR 包時需要將對應的資料庫的驅動包匯入工程中。

注2:使用者使用時,注意將範例程式碼中的工程路徑、範本名稱使用者自己工程下的;資料庫連結資訊取代為使用者準備好的資料庫。

注3:如果資料庫大小寫不敏感即不區分大小寫,程式碼無需修改;如果資料庫區分大小寫,則需要將表名需要加雙引號,修改後 insert into \"report\" values(?,?)

package com.fr.demo;

import com.fr.base.operator.common.CommonOperator;
import com.fr.chart.activator.ChartBaseActivator;
import com.fr.cluster.engine.activator.standalone.StandaloneModeActivator;
import com.fr.config.activator.BaseDBActivator;
import com.fr.config.activator.ConfigurationActivator;
import com.fr.env.operator.CommonOperatorImpl;
import com.fr.general.I18nResource;
import com.fr.health.activator.ModuleHealActivator;
import com.fr.io.ResourceRepositoryActivator;
import com.fr.module.Module;
import com.fr.module.tool.ActivatorToolBox;
import com.fr.report.ReportActivator;
import com.fr.report.RestrictionActivator;
import com.fr.report.module.ReportBaseActivator;
import com.fr.report.write.WriteActivator;
import com.fr.scheduler.SchedulerActivator;
import com.fr.store.StateServiceActivator;
import com.fr.workspace.simple.SimpleWork;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class SaveReportToDatabase {
    public static void main(String[] args) {
        SaveReport();
    }

    private static void SaveReport() {
        try {
            // 定義報表運作環境,用於執行報表
            Module module = ActivatorToolBox.simpleLink(new BaseDBActivator(),
                    new ConfigurationActivator(),
                    new ResourceRepositoryActivator(),
                    new StandaloneModeActivator(),
                    new ModuleHealActivator(),
                    new StateServiceActivator(),
                    new ChartBaseActivator(),
                    new SchedulerActivator(),
                    new ReportBaseActivator(),
                    new RestrictionActivator(),
                    new ReportActivator(),
                    new WriteActivator());
            SimpleWork.supply(CommonOperator.class, new CommonOperatorImpl());
            String envpath = "//Applications//FineReport10_325//webapps//webroot//WEB-INF";//工程路徑
            SimpleWork.checkIn(envpath);
            I18nResource.getInstance();
            module.start();


            // 連結資料庫
            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://review.finedevelop.com:3306/susie";
            String user = "root";
            String pass = "ilovejava";
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, user, pass); //注意表名是否區分大小寫
            conn.setAutoCommit(false);
            PreparedStatement presmt = conn
                    .prepareStatement("INSERT INTO report VALUES(?,?)");

            // 讀進需要儲存入庫的範本檔案
            File cptfile = new File(envpath
                    + "//reportlets//GettingStartedTW.cpt");
            int lens = (int) cptfile.length();
            InputStream ins = new FileInputStream(cptfile);
            // 將範本儲存入庫
            presmt.setString(1, "GettingStartedTW.cpt"); // 第一個欄位存放範本相對路徑
            presmt.setBinaryStream(2, ins, lens); // 第二個欄位存放範本檔案的二進制流
            presmt.execute();
            conn.commit();
            presmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            SimpleWork.checkOut();
        }
    }
}


2.4 編譯 Java 檔案

Java 程式編寫完成後,在編譯器中編譯 SaveReportToDatabase.java ,編譯透過後,就會在資料庫表report 中看到新增的範本記錄。如下圖所示:

1641363051GlIS.png

附件列表


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

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

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

不再提示

10s後關閉

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

反馈已提交

网络繁忙