国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JasperReport經驗談

2019-11-18 11:26:01
字體:
來源:轉載
供稿:網友

JasperReport和iReport是不錯的java報表工具. 在實際項目中, 本人用它們開發了20個Report, 涉及SubReport, Image, Graph, 積累了一些經驗. 尤其是關于EXPort到Excel方面, 文檔上也很少提及, 純粹是摸索出來的, 有的問題還是通過讀源代碼才解決的. 此貼并非入門教程, 差不多算是筆記吧, 以問答形式記錄. 

  1. iReport
  2. 安裝
    1. 下載,解壓iReport 0.4.0 (推薦src版本)
    2. 確認JDK是1.4以上
    3. 把JDK /lib下的tools.jar拷貝到{ireport_home}/lib目錄中
  3. 運行
    1. 對于下載的Binary版本,只能運行/bin/startup.bat
    2. 對于下載的Src版本,可以通過ant iReport運行(先安裝ant)
    3. 假如運行startup.bat,出現java.lang.NoSUChMethodError錯誤,一般是JDK版本太低。假如確認已安裝了1.4或以上,檢查path系統變量,看看有1.3的JRE是不是排在前面(比如安裝了Oracle的客戶端,往往有1.3的JRE),假如出現Class Not Found,檢查classpath。對于通過ant的方式運行,一般都沒什么問題,所以推薦下載src版本
  4. JasperReport 常見問題
    1. .jrxml vs .jasper
      • 假如在運行時載入.jrxml, 那么每次調用還得編譯, 不如預先編譯成.jasper.不過預先編譯的jasper,必須用同樣版本的JasperReport載入,而且靈活性差些. 不過對于大部分報表,還是預先編譯成jasper方便
    2. 假如批量編譯jrxml
      • 用Ant很輕易解決

         

        .....

         

    3. 如何使用圖片?
      • 很輕易,用Image控件就可以了. 在Image ExPRess里面可以用String來表示圖片的路徑, 或者用InputStream, File對象.不過不管用File還是String對象, 都不得不用絕對路徑, 這顯然很不靈活. 解決辦法是,穿入一個$P的參數,表示圖片所在的目錄,然后用$P和文件名拼接出完整的絕對路徑. 更好的方法是用InputStream, 例如this.getClass().getResourceAsStream("logo.jpg") ,這時只要把圖片放在當前.jasper所在的目錄就可以了,不必考慮什么參數,什么路徑了
    4. 顯示非數據庫字段變量
      • 顯示如運行日期等,可以直接在Text Field里面輸入new java.util.Date(), 然后把Pattern設成如mm/dd/yyyy.
    5. 動態控制某些Field是否顯示
      • 每個Static Text, Text Field甚至整個Band的屬性里面都有Print When Expression, 比如設成new Boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么只有當參數display的值為yes的時候才顯示
    6. 使用Sub Report, 如何使用相對路徑
      • 見1.3, 和使用圖片類似, 用InputStream或者傳入參數
    7. Query里面如何使用參數
      • $P!{xxx} 或者 $P{xxx} 后者只能用于類似PreparedStatement參數綁定, 而前者可替換Sql的任意部分. 在需要動態排序的時候, 前者非凡有用. 比如 select a,b,c from t order by $P!{orderClause}   不管用$P還是$P!, SQL最終是以PreparedStatement方式執行的, 不必太擔心性能問題   注重:參數是不能嵌套的, 比如$P{a} =''$P''   , $P=''value'', 不要指望$P{a}能被替換成''value''
    8. 如何使用圖表(Graph)
      • JasperReport本身沒有圖表功能, 只有顯示Image的功能(見4.3). iReport里有個Graph向導, 其實質是通過jFreeChart生成Image. 更另外, 更直接的做法是放一個Image控件, Image Express Class設置成java.awt.Image, 在Image Expression里通過自定義的類返回java.awt.Image對象. 例如''Graphprovider.getImage($P{REPORT_DATASOURCE},title, suBTitle.....)''.  GraphProvider是自己的類, public static Image getImage(JRDataSource, ....)
    9. 假如顯示多個圖表
      • 在一張報表上顯示一個圖表和顯示多個圖表是不同的. 假設Query是select name,price,qty from xxx, 第一張圖顯示name-price, 第二張圖顯示name-qty, 假如還是按3.8的方法, 第二張圖根本顯示不出來! 為什么  因為傳入的是JRDataSource, 而JRDataSource僅僅是對ResultSet的簡單封裝, 在第一張圖處理完后, 游標已經到了eof位置了, 在開始處理第二張圖的時候,就必然拋出游標耗盡的異常! 怎么辦   自己寫個JRDataSourceAdapter, 把JRDataSource對象里面的值預先保存到一個Collection (相當于一個Offline的數據集), 然后把這個Collection傳個getImage方法. 具體是, 建一個Variable  mydate, 類型是java.util.Map, Calculation Type- System, Initial Value Expression是JRDataSourceAdapter.JRDataSource2Map($P{REPORT_DATA_SOURCE},new String[]{"NAME","PRICE","QTY"},new Class[]{java.lang.String.class,java.lang.Double.class,java.lang.Double.class}), JRDataSource2Map是自己寫的一個Adapter. 然后在Image的Expression里面換成如''GraphProvider.getImage(mydata,title, other params...), 當然得修改getImage方法
  5. Export到Excel的問題
    1. 如何去掉報表頭等
      • 直接把不需要的Band刪除(把其高度設為0). 假如僅僅是export到Excel的時候不需要報表頭, 而輸出到PDF等仍然需要保留, 那么使用print when expression, 見4.4
    2. 假如讓Excel看起來整潔
      • 不要有空白地方! 首先把所有的Field設成一樣高, 對齊! 把所在Band的高度也設成和Field一樣高, 讓Field正好放入Band. 然后調整Field的寬度, 讓每個Field都相鄰,沒有空隙. 最后,記得設置參數: exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梧州市| 黑山县| 治县。| 伊通| 卓资县| 顺义区| 开远市| 界首市| 明光市| 汕头市| 合水县| 阳东县| 商河县| 五华县| 奈曼旗| 德昌县| 星子县| 定远县| 绿春县| 酒泉市| 襄汾县| 兰坪| 精河县| 分宜县| 苏尼特右旗| 泰来县| 泸水县| 郴州市| 铅山县| 忻州市| 海晏县| 株洲市| 城市| 马边| 双牌县| 偏关县| 开封市| 惠安县| 胶州市| 库伦旗| 南郑县|