wuxiren123

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          關(guān)于Web報(bào)表FineReport打印的開發(fā)應(yīng)用案例

          報(bào)表打印是報(bào)表使用和開發(fā)過程中經(jīng)常碰到的問題,這里匯總了關(guān)于Web報(bào)表開發(fā)打印功能的一些典型應(yīng)用案例,以應(yīng)用最廣泛的FineReport為例。

          案例一:java直接調(diào)用報(bào)表打印

          當(dāng)java后臺(tái)定義定時(shí)打印的功能,同時(shí)又需要直接調(diào)用報(bào)表的打印的時(shí)候,由于打印機(jī)型號(hào)和紙張不同,需要指定打印機(jī),從而打印是否成功并設(shè)置返回值。那么怎么樣可以實(shí)現(xiàn)這一過程呢?

          實(shí)現(xiàn)過程

          1、定義報(bào)表運(yùn)行環(huán)境

          // 定義報(bào)表運(yùn)行環(huán)境,才能執(zhí)行報(bào)表  
                   String envPath = "D:\\FineReport\\develop\\code\\build\\package\\WebReport\\WEB-INF";  
                   FRContext.setCurrentEnv(
          new LocalEnv(envPath));

          2、定義執(zhí)行模板工作簿

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

          3、  獲取報(bào)表參數(shù)并設(shè)置值

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

          4、  java中調(diào)用報(bào)表打印方法并進(jìn)行判斷

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

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

          // java中調(diào)用報(bào)表打印方法  
                       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、  完整代碼

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

          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) {    
                   
          // 定義報(bào)表運(yùn)行環(huán)境,才能執(zhí)行報(bào)表    
                   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");    
                       
          // 參數(shù)傳值    
                       Parameter[] parameters = workbook.getParameters();    
                       HashMap
          <String, String> paraMap = new HashMap<String, String>();  
                       paraMap.put(parameters[
          0].getName(), "華北");  
                         
                       
          // java中調(diào)用報(bào)表打印方法    
                       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();    
                   }
              
               }
              
           }


          編輯該程序,彈出打印機(jī)設(shè)置窗口,選擇打印機(jī)就可以進(jìn)行打印了,并在后臺(tái)返回結(jié)構(gòu):成功!返回true。

          案例二:打印模板與預(yù)覽模板不同

          問題反饋

          在打印的過程中,有的用戶可能會(huì)遇到如下情況:用戶系統(tǒng)中使用iframe嵌入報(bào)表,客戶端瀏覽器看到的是報(bào)表樣式1,打印的時(shí)候不是看到的效果,而是樣式2.例如用戶系統(tǒng)顯示報(bào)表的iframe大小固定,無法完全顯示A4紙張大小的模板,因此在顯示報(bào)表的時(shí)候進(jìn)行了分頁處理。如果直接將這個(gè)顯示結(jié)構(gòu)打印到A4紙上,每頁紙上只顯示固定條數(shù)據(jù),下面全是空白的,這樣既不美觀又浪費(fèi)紙張。

          點(diǎn)擊打印的時(shí)候,通過js調(diào)用FR的打印方法,使用打印模板進(jìn)行打印,如下:

          <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(){  //點(diǎn)擊打印時(shí)觸發(fā)
                  var reportURL="/WebReport/ReportServer?reportlet=report_print.cpt"//打印模板路徑,與BS查看的效果不同
                  FR.doURLFlashPrint(reportURL);   //調(diào)用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>

          案例三:將當(dāng)前頁數(shù)據(jù)入庫數(shù)據(jù)入庫

          模板多張頁面,如一些了的賬簿模板,每次紙打印部分頁面,每次打印后希望觸發(fā)事件,在數(shù)據(jù)庫中對于位置記錄本頁面對應(yīng)的賬簿已經(jīng)打印過了。每張頁面在固定位置有本張賬簿的編號(hào),對于到數(shù)據(jù)庫中有一個(gè)記錄是否已經(jīng)打印的記錄字段。

           以已部署過FineReport的WebReport工程到tomcat服務(wù)器為例,其詳細(xì)過程如下:

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

          打開設(shè)計(jì)器,打開其tomcat報(bào)表共組目錄,在菜單中點(diǎn)擊報(bào)表>報(bào)表WEB屬性>分頁預(yù)覽設(shè)置,在右邊欄中,如點(diǎn)擊添加Flash打印后事件。

          在其JavaScript中,輸入js代碼,目的是調(diào)用其WedReport工程下寫的一個(gè)jsp的執(zhí)行入庫操作。

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

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

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

          3、通過Ajax把值傳到j(luò)sp頁面

          完整代碼如下:

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

          $.ajax({

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

          })

          4、定義jsp獲取編號(hào)修改數(shù)據(jù)庫表

             定義頁面print1.jsp,首先獲取編號(hào)ID的值,連接數(shù)據(jù)庫通過update語句把表中toprint字段進(jìn)行修改,代碼如下:

          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 {  
                      
          // 連接數(shù)據(jù)庫  
                      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(?,?)");  
                      
          // 讀進(jìn)需要保存入庫的模板文件  
                      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"); // 第一個(gè)字段存放模板相對路徑  
                      presmt.setBinaryStream(2, ins, lens); // 第二個(gè)字段存放模板文件的二進(jìn)制流  
                      presmt.execute();  
                      conn.commit();  
                      presmt.close();  
                      conn.close();  
                  }
           catch (Exception e) {  
                      e.printStackTrace();  
                  }
            
              }
            
          }


          案例四:將打印信息提交入庫

          打印時(shí),有時(shí)想清楚的知道,哪些報(bào)表在什么時(shí)間被打印的信息,并將其記錄到數(shù)據(jù)庫的一張記錄表中,以方便查看相關(guān)信息。一般地,點(diǎn)擊打印后就會(huì)直接觸發(fā)打印事件,即點(diǎn)擊打印就是執(zhí)行打印的狀態(tài)。以整個(gè)工程,在瀏覽器中對其中的報(bào)表預(yù)覽時(shí),點(diǎn)擊FLASH打印后將其打印信息記錄到庫表中為例。

          1、  新建信息表

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

          2、  添加打印后事件

          點(diǎn)擊服務(wù)器>服務(wù)器配置,選擇分頁預(yù)覽設(shè)置選項(xiàng),進(jìn)入分頁預(yù)覽設(shè)置窗口。在右邊欄中,點(diǎn)擊添加FLASH打印后事件,如下圖所示:


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

          案例五:動(dòng)態(tài)打印

          在進(jìn)行報(bào)表查看時(shí),有時(shí)會(huì)發(fā)現(xiàn)一兩條重要或者錯(cuò)誤信息,需要將其進(jìn)行打印出來備份一下,這時(shí)就需要?jiǎng)討B(tài)實(shí)現(xiàn)打印效果,勾選需打印的信息,將其打印出來。

          1、  父模板

          • 數(shù)據(jù)準(zhǔn)備

          新建模板,新建數(shù)據(jù)查詢:sql為SELECT * FROM 雇員。

          • 報(bào)表主體設(shè)計(jì)

          在A3單元格中使用復(fù)選框控件,用來勾選需要打印的信息,如下圖:

          • 獲取復(fù)選框的值

          為復(fù)選框添加初始化事件,將勾選項(xiàng)的信息放到數(shù)組中保存,代碼如下:

          if(!FR.checkBoxes){
          FR.checkBoxes
          =new Array();
          }

          var len=FR.checkBoxes.length;
          FR.checkBoxes[len]
          =this;
          • 工具欄添加自定義打印按鈕

          點(diǎn)擊模板>模板web屬性>填報(bào)頁面設(shè)置,選擇為該模板單獨(dú)設(shè)置,添加一個(gè)自定義打印按鈕至工具欄中,并把自定義打印按鈕清空

           自定義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、  子模板

          • 數(shù)據(jù)準(zhǔn)備

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

          • 報(bào)表主體設(shè)計(jì)

          保存

           3、  預(yù)覽和打印

          打開父模板,點(diǎn)擊填報(bào)預(yù)覽,選中需要打印的數(shù)據(jù),點(diǎn)擊工具欄上的打印按鈕,即可將選中信息打印出來了,如下圖:


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


          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 济宁市| 拜泉县| 泸水县| 东乡| 达孜县| 密山市| 莱州市| 三江| 星座| 板桥市| 义乌市| 靖江市| 封丘县| 钟山县| 连云港市| 无锡市| 东光县| 简阳市| 普陀区| 竹北市| 乳山市| 大丰市| 白银市| 嘉鱼县| 神池县| 昭觉县| 保德县| 内江市| 微博| 禹州市| 平罗县| 桓台县| 会泽县| 襄汾县| 武城县| 巴东县| 东莞市| 招远市| 安阳市| 灌云县| 彩票|