下面通過報表開發軟體FineReport來簡單介紹一下。
工具/原料
報表開發軟體FineReport7.1.1
大小:148.2M 適用平臺:windows/linux
方法/步驟
模板多張頁面,如一系列的帳簿的模板。每次只打印部分頁面(可能是一張,可能是多張,不一定從第一頁開始),每次列印後希望觸發事件,在資料庫中對應位置記錄本頁面對應的帳簿已經列印過了。每張頁面在固定位置有本張帳簿的編號,對應到資料庫中有一個記錄是否已經列印的記錄欄位,如只打印第三頁時,希望在資料庫中編號3457的帳簿所對應的toprint欄位值改為true。如下圖效果:
實現思路
FineReport6.5中,可通過報表>報表Web屬性>分頁預覽設定>新增列印後事件,使用JavaScript呼叫一個jsp的執行事件。若點選列印,就會將當前頁的編號獲取到,進而通過update語句修改toprint欄位的值。
示例
以已部署過FineReport的WebReport工程到tomcat伺服器為例,其詳細過程如下:
對模板新增列印後事件
開啟設計器,開啟其tomcat報表工作目錄,在選單中點選報表>報表Web屬性>分頁預覽設定,在右邊欄中,如點選新增Flash列印後事件。
在其JavaScript中,輸入js程式碼,目的是呼叫其WebReport工程下寫的一個jsp的執行入庫操作。
獲取所在頁單元格的值
如編號ID在J3單元格,即第三行、第十列,則js方法如下:
var a = $("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;
註釋:$("#r-2-0","div.reportPane") 這個是獲取模板當前頁第三行,第一行為:"#r-0-0",行號從0開始;
註釋:eq(9)[0] 是獲取第9列,第一列為eq(0)[0],列號從0開始。
注:如果是擴充套件單元格,則要根據擴充套件以後所在的行與列來獲取。
通過Ajax把值傳到jsp頁面
完整程式碼如下:
var a = $("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;
$.ajax({
url : ';+a
})
定義jsp獲取編號修改資料庫表
定義頁面print1.jsp,首先獲取編號ID的值,連線資料庫通過update語句把表中toprint欄位進行修改,程式碼如下:
package com.fr.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import com.fr.base.FRContext;
import com.fr.base.dav.Env;
public class SaveReportToDatabase {
public static void main(String[] args) {
SaveReport();
}
private static void SaveReport() {
try {
// 連線資料庫
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@192.168.100.169:1521:orcl10g";
String user = "temp";
String pass = "temp123";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement presmt = conn
.prepareStatement("insert into report values(?,?)");
// 讀進需要儲存入庫的模板檔案
Env oldEnv = FRContext.getCurrentEnv();
String envPath = oldEnv.getPath();
File cptfile = new File(envPath
+ "\\reportlets\\gettingstarted.cpt");
int lens = (int) cptfile.length();
InputStream ins = new FileInputStream(cptfile);
// 將模板儲存入庫
presmt.setString(1, "gettingstarted.cpt"); // 第一個欄位存放模板相對路徑
presmt.setBinaryStream(2, ins, lens); // 第二個欄位存放模板檔案的二進位制流
presmt.execute();
conn.commit();
presmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
將其print1.jsp檔案放到tomcat伺服器的WebReport工程下。
效果預覽
啟動Web伺服器,預覽報表,點選Flash列印,列印完之後檢視資料庫的記錄資訊表print1,可看到當前頁的編號對應的toprint欄位值變成true了。