关于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"?οnclick=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.οnbefοreunlοad=null; FR.doURLPDFPrint(url);并保存
1、? 子模板
-
數據準備
新建模板,新建數據查詢ds1,sql為SELECT * FROM 雇員 where 雇員id in (${ids}),該參數是為了接收父模板傳遞過來的雇員id。
-
報表主體設計
保存
3、? 預覽和打印
打開父模板,點擊填報預覽,選中需要打印的數據,點擊工具欄上的打印按鈕,即可將選中信息打印出來了,如下圖:
本文轉自 雄霸天下啦 51CTO博客,原文鏈接:http://blog.51cto.com/10549520/1844789,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的关于Web报表FineReport打印的开发应用案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决win10 .net framewo
- 下一篇: ASA对FTP的审查抓包测试