關於Web報表FineReport打印的開發應用案例

報表打印是報表使用和開發過程當中常常碰到的問題,這裏彙總了關於Web報表開發打印功能的一些典型應用案例,以應用最普遍的FineReport爲例。 案例一:java直接調用報表打印 當java後臺定義定時打印的功能,同時又須要直接調用報表的打印的時候,因爲打印機型號和紙張不一樣,須要指定打印機,從而打印是否成功並設置返回值。那麼怎麼樣能夠實現這一過程呢? 實現過程 一、定義報表運行環境javascript

// 定義報表運行環境,才能執行報表  
         String envPath = "D:\\FineReport\\develop\\code\\build\\package\\WebReport\\WEB-INF";  
         FRContext.setCurrentEnv(new LocalEnv(envPath));

二、定義執行模板工做簿css

TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "GettingStarted.cpt");

三、 獲取報表參數並設置值html

// 參數傳值  
             Parameter[] parameters = workbook.getParameters();  
             HashMap<String, String> paraMap = new HashMap<String, String>();
             paraMap.put(parameters[0].getName(), "華北");

四、 java中調用報表打印方法並進行判斷 經過公式PrintUtils.printWorkBook(cptPath)進行打印,此時不彈出打印窗口。 若需打印選項對話框,則使用PrintUtils.printWorkBook(cptPath, true),其中參數true爲顯示打印選項對話框,代碼以下所示:java

// java中調用報表打印方法  
             boolean a = PrintUtils.printWorkBook("GettingStarted.cpt", paraMap, true);  
             if (a == false) {  
                 System.out.println("失敗啦!返回" + a);  
             } else {  
                 System.out.println("成功!返回" + a);  
             }

其中printWorkBook()返回值爲boolean型,可經過返回值true(打印成功)和false(打印失敗)來判斷打印是否成功。 五、 完整代碼 上述所示的過程的能夠經過完整代碼來編輯進行打印,以下所示:web

package com.fr.io;    

import java.io.File;    
import java.util.HashMap; 
import com.fr.base.FRContext;      
import com.fr.base.Parameter;    
import com.fr.dav.LocalEnv;
import com.fr.main.TemplateWorkBook; 
import com.fr.print.PrintUtils;  
   
  
public class JavaPrint {    
     public static void main(String[] args) {    
         // 定義報表運行環境,才能執行報表    
         String envPath = "D:\\FineReport\\develop\\code\\build\\package\\WebReport\\WEB-INF";    
         FRContext.setCurrentEnv(new LocalEnv(envPath));    
         try {    
             TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "GettingStarted.cpt");    
             // 參數傳值    
             Parameter[] parameters = workbook.getParameters();    
             HashMap<String, String> paraMap = new HashMap<String, String>();  
             paraMap.put(parameters[0].getName(), "華北");  
               
             // java中調用報表打印方法    
             boolean a = PrintUtils.printWorkBook("GettingStarted.cpt", paraMap, true);    
             if (a == false) {    
                 System.out.println("失敗啦!返回" + a);    
             } else {    
                 System.out.println("成功!返回" + a);    
             }    
         } catch (Exception e) {    
             e.printStackTrace();    
         }    
     }    
 }

編輯該程序,彈出打印機設置窗口,選擇打印機就能夠進行打印了,並在後臺返回結構:成功!返回true。 案例二:打印模板與預覽模板不一樣 問題反饋 在打印的過程當中,有的用戶可能會遇到以下狀況:用戶系統中使用iframe嵌入報表,客戶端瀏覽器看到的是報表樣式1,打印的時候不是看到的效果,而是樣式2.例如用戶系統顯示報表的iframe大小固定,沒法徹底顯示A4紙張大小的模板,所以在顯示報表的時候進行了分頁處理。若是直接將這個顯示結構打印到A4紙上,每頁紙上只顯示固定條數據,下面全是空白的,這樣既不美觀又浪費紙張。 點擊打印的時候,經過js調用FR的打印方法,使用打印模板進行打印,以下:ajax

<html>
<head>
<script type="text/javascript" src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script>
<link rel="stylesheet" type="text/css" href="/WebReport/ReportServer?op=emb&resource=finereport.css"/>
<script type="text/javascript">
	function doFRPrint(){  //點擊打印時觸發
		var reportURL="/WebReport/ReportServer?reportlet=report_print.cpt"; //打印模板路徑,與BS查看的效果不一樣
        FR.doURLFlashPrint(reportURL);   //調用FR打印方法
	}
</script>
</head>
<body>
<div id="toolbar">
	<button type="button" onclick=doFRPrint()>打印</button>
</div>
<iframe id="reportFrame" src="/WebReport/ReportServer?reportlet=report.cpt&__showtoolbar__=false" width=100% height=80%></iframe>
</body>
</html>

案例三:將當前頁數據入庫數據入庫 模板多張頁面,如一些了的帳簿模板,每次紙打印部分頁面,每次打印後但願觸發事件,在數據庫中對於位置記錄本頁面對應的帳簿已經打印過了。每張頁面在固定位置有本張帳簿的編號,對於到數據庫中有一個記錄是否已經打印的記錄字段。 輸入圖片說明 輸入圖片說明 以已部署過FineReport的WebReport工程到tomcat服務器爲例,其詳細過程以下: 一、 對模板添加打印後事件 打開設計器,打開其tomcat報表共組目錄,在菜單中點擊報表>報表WEB屬性>分頁預覽設置,在右邊欄中,如點擊添加Flash打印後事件。 在其JavaScript中,輸入js代碼,目的是調用其WedReport工程下寫的一個jsp的執行入庫操做。 2.、獲取所在頁單元格的值 如編號ID在J3單元格,即第三行、第十列,則js方法以下: var a =$("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML; 三、經過Ajax把值傳到jsp頁面 完整代碼以下: var a =$("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML; $.ajax({ url : 'http://localhost:8080/WebReport/print1.jsp?ID='+a }) 四、定義jsp獲取編號修改數據庫表 定義頁面print1.jsp,首先獲取編號ID的值,鏈接數據庫經過update語句把表中toprint字段進行修改,代碼以下:sql

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

案例四:將打印信息提交入庫 打印時,有時想清楚的知道,哪些報表在什麼時間被打印的信息,並將其記錄到數據庫的一張記錄表中,以方便查看相關信息。通常地,點擊打印後就會直接觸發打印事件,即點擊打印就是執行打印的狀態。以整個工程,在瀏覽器中對其中的報表預覽時,點擊FLASH打印後將其打印信息記錄到庫表中爲例。 一、 新建信息表 新建一張記錄信息表,如:在access數據庫中新建一張表,命名爲表1。其中輸入兩個字段:date和tableName,類型分別爲日期和文本類型。 二、 添加打印後事件 點擊服務器>服務器配置,選擇分頁預覽設置選項,進入分頁預覽設置窗口。在右邊欄中,點擊添加FLASH打印後事件,以下圖所示: 輸入圖片說明 選擇提交入庫及選擇其信息記錄表,且點擊智能添加字段後,如上在date中輸入公式:=today()獲取當前日期,在tablename中輸入公式:=reportName獲取當前打印的報表。 案例五:動態打印 在進行報表查看時,有時會發現一兩條重要或者錯誤信息,須要將其進行打印出來備份一下,這時就須要動態實現打印效果,勾選需打印的信息,將其打印出來。 一、 父模板 數據準備 新建模板,新建數據查詢:sql爲SELECT * FROM 僱員。 報表主體設計 在A3單元格中使用複選框控件,用來勾選須要打印的信息,以下圖: 輸入圖片說明 獲取複選框的值 爲複選框添加初始化事件,將勾選項的信息放到數組中保存,代碼以下:數據庫

if(!FR.checkBoxes){
FR.checkBoxes=new Array();
}
var len=FR.checkBoxes.length;
FR.checkBoxes[len]=this;工具欄添加自定義打印按鈕

點擊模板>模板web屬性>填報頁面設置,選擇爲該模板單獨設置,添加一個自定義打印按鈕至工具欄中,並把自定義打印按鈕清空 輸入圖片說明 自定義JavaScript,代碼以下:數組

var joinData=function(){
var datas=[];
 for(var i=0;i<FR.checkBoxes.length;i++){
var checkBox=FR.checkBoxes[i];
if(checkBox.getValue()===true){
var colRow=FR.cellStr2ColumnRow(checkBox.options.location);
colRow.col++;
var location=FR.columnRow2CellStr(colRow);
var value=_g().getCellValue(location,null);
datas[datas.length]=value;
}
}
return datas.join(",");

}
var data=joinData();
var url="http://localhost:8075/WebReport/ReportServer?reportlet=doc/Advanced/PrintReport/SelectPrint_son.cpt"+"&ids="+data;
window.onbeforeunload=null;
FR.doURLPDFPrint(url);

並保存 一、 子模板 數據準備 新建模板,新建數據查詢ds1,sql爲SELECT * FROM 僱員 where 僱員id in (${ids}),該參數是爲了接收父模板傳遞過來的僱員id。 報表主體設計 輸入圖片說明保存 三、 預覽和打印 打開父模板,點擊填報預覽,選中須要打印的數據,點擊工具欄上的打印按鈕,便可將選中信息打印出來了,以下圖: 輸入圖片說明瀏覽器

相關文章
相關標籤/搜索