<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wuxiren123

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

    報表打印是報表使用和開發過程中經常碰到的問題,這里匯總了關于Web報表開發打印功能的一些典型應用案例,以應用最廣泛的FineReport為例。

    案例一:java直接調用報表打印

    當java后臺定義定時打印的功能,同時又需要直接調用報表的打印的時候,由于打印機型號和紙張不同,需要指定打印機,從而打印是否成功并設置返回值。那么怎么樣可以實現這一過程呢?

    實現過程

    1、定義報表運行環境

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

    2、定義執行模板工作簿

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

    3、  獲取報表參數并設置值

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

    4、  java中調用報表打印方法并進行判斷

    通過公式PrintUtils.printWorkBook(cptPath)進行打印,此時不彈出打印窗口。

    若需打印選項對話框,則使用PrintUtils.printWorkBook(cptPath, true),其中參數true為顯示打印選項對話框,代碼如下所示:

    // 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(打印失敗)來判斷打印是否成功。

    5、  完整代碼

    上述所示的過程的可以通過完整代碼來編輯進行打印,如下所示:

    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的打印方法,使用打印模板進行打印,如下:

    <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服務器為例,其詳細過程如下:

    1、  對模板添加打印后事件

    打開設計器,打開其tomcat報表共組目錄,在菜單中點擊報表>報表WEB屬性>分頁預覽設置,在右邊欄中,如點擊添加Flash打印后事件。

    在其JavaScript中,輸入js代碼,目的是調用其WedReport工程下寫的一個jsp的執行入庫操作。

    2.、獲取所在頁單元格的值

    如編號ID在J3單元格,即第三行、第十列,則js方法如下:

    var a =$("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;

    3、通過Ajax把值傳到jsp頁面

    完整代碼如下:

    var a =$("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;

    $.ajax({

    url : 'http://localhost:8080/WebReport/print1.jsp?ID='+a

    })

    4、定義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.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打印后將其打印信息記錄到庫表中為例。

    1、  新建信息表

    新建一張記錄信息表,如:在access數據庫中新建一張表,命名為表1。其中輸入兩個字段:date和tableName,類型分別為日期和文本類型。

    2、  添加打印后事件

    點擊服務器>服務器配置,選擇分頁預覽設置選項,進入分頁預覽設置窗口。在右邊欄中,點擊添加FLASH打印后事件,如下圖所示:


    選擇提交入庫及選擇其信息記錄表,且點擊智能添加字段后,如上在date中輸入公式:=today()獲取當前日期,在tablename中輸入公式:=reportName獲取當前打印的報表。

    案例五:動態打印

    在進行報表查看時,有時會發現一兩條重要或者錯誤信息,需要將其進行打印出來備份一下,這時就需要動態實現打印效果,勾選需打印的信息,將其打印出來。

    1、  父模板

    • 數據準備

    新建模板,新建數據查詢: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);

    并保存

    1、  子模板

    • 數據準備

    新建模板,新建數據查詢ds1,sql為SELECT * FROM 雇員 where 雇員id in (${ids}),該參數是為了接收父模板傳遞過來的雇員id。

    • 報表主體設計

    保存

     3、  預覽和打印

    打開父模板,點擊填報預覽,選中需要打印的數據,點擊工具欄上的打印按鈕,即可將選中信息打印出來了,如下圖:


    posted on 2016-08-31 15:29 喝水居然長肉 閱讀(301) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 四虎影院免费视频| 老汉精品免费AV在线播放| 无码免费午夜福利片在线| 久久精品国产亚洲| 久久国产精品一区免费下载| 亚洲综合精品网站在线观看| 黄网站色视频免费看无下截| 免费在线观看视频a| 水蜜桃视频在线观看免费| 亚洲&#228;v永久无码精品天堂久久 | 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 成全视频免费高清| 亚洲一卡一卡二新区无人区| 成人免费无毒在线观看网站 | 四虎国产精品免费久久| 亚洲熟妇AV一区二区三区浪潮| 中文字幕无码不卡免费视频| 亚洲精品无码成人片久久不卡| 国产无遮挡又黄又爽免费视频 | 亚洲精品成人片在线播放 | 午夜亚洲国产理论片二级港台二级| 暖暖在线日本免费中文| 免费看一级一级人妻片| 亚洲五月综合缴情在线观看| 国产日韩AV免费无码一区二区| 亚洲欧洲国产精品你懂的| 国产成人精品免费视频大全麻豆 | 亚洲成Av人片乱码色午夜| 真实国产乱子伦精品免费| 亚洲无吗在线视频| 亚洲AV无码一区二区三区国产 | 精品国产亚洲AV麻豆 | 成全高清在线观看免费| 亚洲日产无码中文字幕| 37pao成人国产永久免费视频| 亚洲 欧洲 自拍 另类 校园| 亚洲一区日韩高清中文字幕亚洲| 大地资源中文在线观看免费版| 亚洲a级在线观看| 久久精品亚洲男人的天堂| 午夜福利不卡片在线播放免费|