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

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

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

    JAVA—咖啡館

    ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

    一、iReportJasperReport簡介

    1.1   簡介

    JasperReport是報表的引擎部分,界面設計是用iReport。為什么選擇這兩個軟件呢?因為這兩個軟件都是開源的,即免費的(雖然某些文檔收費,但是磨滅不了我們使用它的理由)

    JasperReport是一個報表制作程序,用戶按照它制定的規則編寫一個XML文件,然后得到用戶需要輸出的格式文件。它支持輸出的文件格式包括PDFHTMLXMLXLSCSV等等。

    JasperReport做報表,可以分為兩種方式:

    1、 直接利用程序定義一個報表

    2、 寫一個xml文件來描述這個報表,通常需要借助于iReport

    JasperReport做報表時用的都是底層的東西,如線條、靜態文本等,底層的好處就是強大、容易控制報表,但缺點就是編寫很麻煩。慶幸的是,我們有iReport這個軟件,這個軟件完全是彌補JasperReport的不足,將底層編寫推向可視化,大大的方便了我們。

    1.2   工作流程簡介

    JasperReport的工作流程:首先有個xml文件,從xml文件編譯出.jasper類型的文件,而以后我們真正要使用的就是編譯后的jasper文件。

    上圖為JasperReportAPI示意圖,可作為學習的參考。由iReport輸出的文件中,對WEB應用可能有用的是jasper文件,當JAVA程序進行調用的時候,將把jasper文件轉換成print類型,從而進一步到達其他格式的輸出(如上圖)

    二、安裝與配置

    2.1下載相關軟件

    對于較古老的版本,這里不做過多介紹,請參考本目錄下其他文獻。這里提一下,古老版本需要額外下載ANT(JAVAbuild工具)以及iTextAsian.jar(用以支持中文的jar)等。

    iReport http://www.jasperforge.org/jaspersoft/opensource/business_intelligence/ireport/ 下載

    JasperReport http://www.jasperforge.org/jaspersoft/opensource/business_intelligence/jasperreports/ 下載

    JDK http://java.sun.com/ 下載

    本人用的產品版本:iReport 2.0.5-windows版本;JasperReport 2.0.5版本;JDK 1.5.0_4版本。

    注:在新的iReport版本中,已經包含了JasperReportjar包,不需要下載JasperReport包了,但是,要更多的了解JasperReport,還是推薦下載完整的軟件包,以學習它的源代碼和例子。還有,新版本的iReport帶有字體包,不需另下。

    2.2 安裝軟件

    首先安裝JDK,一路NEXT即可。

    其次,安裝iReport,由于新版本對windows支持較好,所以和JDK一樣,一路NEXT即可。

    注:舊版本需要對環境變量進行配置,此篇文章介紹的版本以及更新的版本均不需要手動配置環境變量。

    2.3 其他相關

    您還需要準備一個數據源(如果需要做動態報表的話),大部分情況是一個數據庫。筆者使用的是Oracle 9i的數據庫。


    三、iReport的基本使用

    先看使用界面:

    下面開始初步嘗試。

    1.      新建報表

    彈出對話框如下:

     

    還有許多其他的選項,中文可以理解。有個XML編碼,可以手動輸入,也可保持默認,點擊”OK”創建新表完成。

    注:iReport不會自動保存,需要手動保存,建議多保存。

    2.      報表的結構

    新建的報表如下:

    一個報表的結構大致是幾個部分:titlepageHeadercolumnHeaderdetailcolumnFooterpageFooterlastPageFootersummary以及groupHeadergroupfooter

    ·Title:每個報表一般會有一個名字,比如×××銷售報表,title就是擱置這個名稱的最好地方了,當然你也可以根據需要擱置在合適的地方。Title只在第一頁出現。

    ·pageHeader:報表的一些公共要素,比如頁碼、創建時間、創建人等信息放置在這里是比較好的選擇。

    ·columnHeader:無可非議的這里是放置列的名稱,記住不是列數據。

    ·detial:放置需要循環輸出的數據,比如銷售記錄數據。

    ·columnFooter:放置列級別的統計計算值或是列的說明。

    ·pageFooter:放置頁級別的統計值或是頁的說明。

    ·lastPageFooter:最后一頁特殊的格式,可以放置總結等。

    ·Summary:可能需要對幾頁(你的報表可能有幾個頁組成)的統計值。比如50個銷售記錄共占用了3頁,那么放置這些統計記錄的統計值最好的地方就是summarySummary只在最后一頁出現。

    ·groupHeader:每個表的內容可能需要根據某個屬性進行劃分顯示內容和計算內容,比如希望以月份為單位每組分開顯示銷售記錄,那么就可以定義一個組(組的定義參考后文),groupHeader就是放置組說明或是組標志最好的地方。

    ·Groupfooter:放置組的統計或是說明

    3.      添加對象

    可以通過工具欄的工具添加靜態對象與動態對象。點擊 可以創建靜態對象,點擊 可以創建動態對象。之后在報表的空白處單擊,如此即可把對象添加到報表,然后拖動對象的邊框,使它的大小合適,雙擊即可對對象中的文本進行快速編輯。

    仔細觀察,會發現對象的邊框有兩種顏色,一為藍色,二為紅色,藍色為符合布局要求,紅色反之。

    注:一個對象不能橫跨兩個區域,即不能既在columnHeader里又在detail里。

    鼠標右擊對象,彈出如下菜單:

    點擊屬性,編輯對象的屬性。

    這里面有很多屬性,可以依據要求來更改其中的部分或所有。其中,重要的可能是關于PDF的,如下圖。

    紅框框起來的部分要注意,當要輸出中文的時候,需要類似設置。新版本對邊框的更新,使我們操作起來更為方便。注意下面紅框里的部分,這可以對每一個邊進行分開的設置,人性化的為我們解決了大量問題。

    注:JasperReport沒有現成的表格,最好的方法就是用一個一個對象的邊框堆積起來,組成一個表格。但是,對象的邊框不能覆蓋,否則HTMLEXCEL等不能正常輸出。

    對于動態對象,屬性如下。

    主要屬性如圖所示。在Pattern里,可以定義輸出的格式,在輸出時間和日期或者貨幣時尤為有用。上圖中的”stretch with overflow”表示當填充值超出定義的大小時,自動換行;”blank when null”表示當數據為null時不顯示數據,這兩個在某些時候很有用處。

    而在表達式一欄中,如果字體為藍色,則表示不正確,當輸入正確的時候,會呈現綠色,如圖。

    4.      設置數據來源

    首先,需要添加一個數據源,此處選用Oracle數據庫,步驟如下。

    如下圖,點擊連結/資料來源

    彈出下面對話框,點擊”New”(圖中已有數據源乃是筆者添加)

    選擇一個數據來源,這里選擇第一個JDBC連接數據庫的方式,點擊下一步

    按照圖中的介紹填寫相關信息,并測試信息是否正確,然后保存。iReport可以添加保存多個數據源連接信息。

    注:如提示找不到相關驅動,則需要將驅動的JAR包復制到iReportlib文件夾下。

    5.      變量、參數及字段

    在使用iReport 的過程中會碰到很多與變量(Variables)、參數(Parameters)、字段(Fields)這些有關的內容,我們要介紹這些對象的使用和意義:

    ·字段(Fields):是數據源抽取出來的,希望在報表中出現的數據庫內容。比如一個ID的所有值,$F{ filedsName }

    ·參數(Parameters):這是你的應用需要提供給報表的入口,比如你希望在報表被解釋的時候提供Where語句的條件值,那么就可以使用參數(Parameters),$P{ parameterName }

    ·變量(Variables):這是報表中一些邏輯運算的表現,比如統計值,$V{ variablesName }

                變量

    可以通過以下方式添加、修改和刪除。

    彈出如下對話框:

    紅框里的是iReport自帶的供用戶使用的變量,用于計算數量和總值等。點擊新增,可以增加用戶自己的變量,如圖。

    各個部分功能如標注所示。

                參數

    定義參數的按鈕就在定義變量的旁邊,如上節,不贅述。

    上圖中,紅框里的是系統內置的參數,供用戶調用,其中包括一些常用的參數,如連接、最大值等等。點擊新增按鈕后,出現如下頁面。

    在新增參數對話框中輸入參數的名稱、數據類型、缺省值以及參數的描述信息等。需要注意的是,根據不同的參數類型,在設置參數的缺省值時要使值能與參數類型匹配,即字符型的參數在設置缺省值時要用””把值括起來,如果是數據值型的則不能加””

    參數的引用方式有兩種,,一種是$P{},另一種是$P!{},前者可以出現在任意的表達式位置,而后者則只能出現在SQL腳本里,用來替換查詢語句,用以按照不同的需求替換查詢語句。同時,在腳本里,也有些許區別:前者只能替換語句的部分字段,如SELECT * FROM bugs where name=$P{Name} order by proname, modulename,而對于$P!{},則可以直接在SQL腳本框里輸入$P!{SQL}

                字段

    編輯字段的方式與變量、參數類似,打開字段界面。

    在點擊新增后,出現如上頁面,根據情況填寫字段名稱、字段類型(一般與數據來源類型相匹配)和字段的描述等。這種是手動添加字段,另一種更為方便的方法是從數據源直接讀出,將在后面介紹。

    字段用于動態對象里,即 。它的主要功用在于動態連接數據源,完成數據源的讀出顯示,所以在有動態對象的報表里,執行的時候一般采用執行報表(使用動態連接)”,如圖。

    6.      動態數據源

    從上圖中,選擇默認的動態連接。

    彈出如下界面,各部分功能介紹如圖。

    這便是上面所說的另一種更為方便的添加字段的方法,從數據源直接復制到字段里,方便、快捷。

    如上圖所示,還有三種連接數據源的方式:JavaBeanDataSourceCSV。多種不同的方式給我們添加了很多便利。

    7.     

    組是一個很重要的概念,一個報表可以多個組,每個組以一個關鍵字為標記,比如希望統計是根據項目(或是產品)進行統計的。那么可以設立一個項目標記的組。如圖。

    組的參數設定可以看界面即可理解部分,其中最主要的是“Group expression”,這里必須輸入格式正確的并且存在的字段名稱,本文的“Name”是【字段】中的一個元素。依此類推,建立其他的組對象。每建立一個組,在報表的界面上都會出現該組對應的段,組的HeaderFooter是對應出現的。如圖。

    8.      風格化

    如圖。

    點擊”Styles”,彈出如下界面。

    在這里,我們可以定義許多個常用的格式,按照個人喜好進行定義,定義后,在對象屬性的頁面上可以選擇使用哪種風格,所設置的屬性會自動繼承。如圖:

    9.      界面介紹

    iReport的界面上,處于人性化的考慮,設置了很多快捷按鈕供用戶使用,如圖。

    上圖包括文檔的基本操作,線條與圖形的繪畫,靜態與動態對象的添加,圖表圖像報表的插入,報表、欄等的屬性,也包括編譯、執行等按鈕。

    上圖包括字體字號,一些對象內部的基本排列操作和數據源設置等。

    上圖包括對象的對齊、排列、規格化等操作。

    所有這些快捷按鈕給用戶提供了很大的便利,熟悉之后,用起來會更加順手。

    10. 預覽

    iReport支持多種輸出格式,其中包括PDF,HTML,XML,XLS,CSV等等。介紹一下如何進行預覽和輸出。

    iReport默認是JRViewer輸出預覽,用戶可以在上述菜單中進行調整和選擇。

    在這里,但是只在此設置輸出格式了,還沒有完成設置,還有一個必需的設置就是,為每一種設置選擇執行環境,例如,如果你選擇以PDF 輸出,那么你需要為其指明Adobe Reader 的路徑,如圖選擇菜單Options/選項,則會彈出如下屬性頁:

    選擇之后,保存即可,iReport會自動調用相關程序來完成輸出和預覽。

    四、報表的輸出

    正如前面所說,報表有很多種輸出方式,這里挑選一些常用的進行介紹。

    iReport中,我們可以對報表進行預覽,而此時,是iReport幫助我們完成了絕大部分的工作,我們并不需要輸入代碼來完成輸出,而這里我們所說的輸出是輸出到文件或者輸出到WEB頁面等。

    我們將以輸出html格式為例子講述。有人會問:這html不是靜態頁面嗎?我說,的確是這樣的。不過,html有普遍適用性,我們可以把它插入到動態頁面里面去,比如說JSP或者ASP等。

    動態頁面的技術細節不在這里贅述,這里我們只介紹jasperReport相關,下面我們以JSP相關技術為基底來敘述。

    1)        讀取.jasper文件

    通過iReport軟件,我們可以把已經定義好的XML編譯成.jasper文件,供以后使用。本人把.jasper文件放置在站點根目錄下的reports文件夾內,讀取文件的代碼如下:

    ServletContext servletContext = this.getServletContext();

            String realPath = servletContext.getRealPath("/report/done.jasper");

    2)        轉換成JasperReport類型

    查找到.jasper文件的絕對路徑后,可以對其進行讀取,有很多種方式可以讀取,不過筆者推薦如下方式(這也是官方例子中推薦并使用的)

    JasperReport jasperReport = (JasperReport)JRLoader.loadObject(realPath);

    3)        建立數據源

    前面介紹過,jasperReport支持多種數據來源,比如說:數據庫連接ConnectionJavaBeanCVS數據源等等。不過jasperReport提供一種通用數據源類型JRDataSource,它很多子類實現,即為多種數據來源類型。

    這里,我們介紹兩種普遍數據源:數據庫ConnectionJavaBean

    首先是Connection。通過數據庫的URL、用戶名、密碼和驅動類來進行數據庫的連接,返回Connection即可,當然,此種情況需要在iReport中定義SQL查詢語句。另一種方法是,直接從Connection中完成數據庫的查詢,返回結果集ResultSet,繼而把ResultSet封裝成JRDataSource的子類JRResultSetDataSource。兩種方式沒有孰優孰劣,憑喜好使用即可。兩種方式代碼如下:

    一、

    Class.forName("******Driver");

            conn = DriverManager. getConnection ("***Driver:// localhost:***; DatabaseName =***; user=***; password=***");

    二、

    ResultSet set = statement.executeQuery();//=new ResultSet();

            JRResultSetDataSource source = new JRResultSetDataSource(set);

    對于JavaBean來說。需要定義標準的JavaBean格式,即它的每一個屬性都要有對應的getter/setter方法,而且,需要定義一個Factory類,其中包含一個靜態的方法,返回Collection類型或者Array類型的JavaBean結果集。相比較Connection來說,JavaBean要麻煩許多,不過也要靈活許多,這才是靈活性的體現(因為有時候,查詢語句會很復雜,數據來源一樣會很復雜,而JavaBean無視這一切)JavaBean代碼如下:

    JRBeanCollectionDataSource dataSource;

            Collection rows = NumFactory.generateCollection();

            dataSource = new JRBeanCollectionDataSource(rows);

    上面語句的功能應該很明顯了,不贅述。

    4)        生成JasperPrint對象

    當數據來源確定后,下一步是生成JasperPrint對象。簡單的說,JasperPrint對象就是jasperReport對象的動態填充,即把相關數據插入到報表當中。

    JasperPrint rptPnt = JasperFillManager.fillReport(jasperReport, params, dataSource);

    JasperFillManager類有許多的填充方法,基本囊括了各種參數的填充,包括ConnectionDataSource等的填充。

    5)        輸出

    動態填充數據完成后,就可以進行輸出了。輸出時,有幾種方式:輸出到流,輸出到文件,也可以直接生成視圖等。

    對于每種輸出格式,JasperReport都提供一個特定的Exporter,比如JRXlsExporterJRHtmlExporter等等。這些Exporter中,可以定義相關的輸出格式,有一些是必須要定義的,比如:

    exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);

            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);

    當然,這是流輸出的例子。JRExporterParameter中有所有格式的通用屬性,而對于每種格式,有不同的ExporterParameter對象,對應著不同的參數。用戶所需要的參數定義完畢后,調用exportReport()方法輸出即可。

    五、例子

    下面是一個格式化的報表:

    然后是運行之后的截圖:

    六、獨立性與易集成性

    前面可能把整個過程講述的很復雜,其實,在整個建立與輸出報表過程中,是一氣呵成的。iReportJasperReport是緊密相關的,而除此之外,它們的獨立性非常好。

    利用jasperReport+iReport生成并輸出報表,可以方便的嵌入“胖客戶端”以及WEB工程,以公安項目為例。

    此項目是基于Struts結構的,瀏覽器端的請求是通過ActionServlet來傳遞的,依照項目要求,我們只要把已經做好的jasperReport實例導入到項目里即可。導入方法可參考如下:

    首先,把相關jar包導入到工程的lib文件夾下,搭建必需的環境;

    其次,新建Action類,并將其對應的路徑等相關信息加入xml配置文件中;

    然后,如同輸出html文件一樣,將輸出代碼拷貝到Action類中,實現流的輸出即可;

    最后,將原實例中的相關處理類拷貝到項目中,調整包的路徑,使之正常運作即可。

    這時,只要修改某些頁面的鏈接即可完成報表的輸出。

    七、其他相關問題

    如何使用圖片?

    很容,Image控件就可以了. Image Express 里面可以用String來表示圖路徑, 或者用InputStream, File .不過不File 還是String , 都不得不用路徑, 這顯然很不靈活.決辦法,穿入一個$P 的參數,表示圖所在的目,然后用$P 和文件名拼接出完路徑. 或者代碼來控制, 比如System.getProperty("user.dir")+"\\report.jpg"就表示圖路徑好的方是用InputStream, his.getClass().getResourceAsStream ("report.jpg") ,這時片放在當前.jasper所在的 就可以了,不必考慮么參數,路徑

    動態控制Field 是否顯示

    Static Text, Text Field 甚至整Band 的屬性里面都有Print When Expression, 比如設成new boolean(!$P{isDisplay}.equalsIgnoreCase("yes")), 那么有當參數displayyes 的時候顯示。

    使Sub Report, 如何使用相對路徑

    使用圖片類似,最好使InputStream 或者傳入參數。

    Query里面如何使用參數

    $P!{xxx} 或者 $P{xxx} 后者能用于類似PreparedStatement參數, 而前者可替換Sql 的任意部分. 在需要動態排序的時候, 前者特別有用. 比如select a,b,c from t order by $P!{orderClause} $P 還是$P!, SQL是以PreparedStatement 式執行的, 不必太擔心性能問題 注意:參數是不能嵌套,比如$P{a} =''$P{b}'' , $P{b}=''value'', 不要$P{a}被替換''value''

    如何使用圖表(Graph)

    JasperReport 沒有圖表功能, 有顯示Image 的功能,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, ....)

    如果顯示多個圖表

    在一報表上顯示一個圖表和顯示多個圖表是不同的. Query selectname,price,qty from xxx, 圖顯示name-price, 第二張圖顯示name-qty, 如果還是按上面的方, 第二張本顯示不出來! 因為傳入的是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

    ExportExcel的問題

    如何去掉報表頭

    不需要的Band 刪除(高度設為0). 如果僅僅export Excel 的時候不需要報表, 而輸出到PDF 然需要保, 那么使print when expression, 前面

    如何讓Excel 看起來整齊

    不要有空白方,首先所有的Field 設成一樣高, ! 所在Band 高度也設成和Field 樣高, Field Band. 然后調整Field 寬度, 讓每Field 都相,沒有空.(如果設置正確,所有的Field 邊框在鼠標點中的時候顯示色,否則是) 最后,得設置參數

    exporter.setParameter(JRXlsExporterParameter. IS_REMOVE_EMPTY_SPACE_BETWEEN _ROWS , Boolean.TRUE);

    如何保留GridLine

    首先, 設置參數exporter.setParameter (JRXlsExporterParameter. IS_WHITE_PAGE_BACKGROUND , Boolean.FALSE);然后,把每個Field 或者Static Text 框的''Transparent''屬性都勾上

    如何使字段名只顯示一次

    如果把字段名放在ColumnHead 區域, 那么輸出到Excel, 會每個Page 都顯示一遍. 在設計Report 時候, 一般會設定Page 大小. 然而對于Excel, 這個Page設定仍然存在,而且往往很討厭, 因為在Excel , 通常希望得到連續的數據, 然而Jasper 仍然會''自作多情''進行分頁. 比如說, 設計JasperReport 的時候, 設定page sizeLetter, Portrait, 那么輸出到Excel 的時候每隔大約30 (具體取決于Field 的高度), page header, column header, column foot, page foot 會被重復一次,而且還附帶一個高度為0 Excel Row, 表示Page Break 的地方. 把字段名放在title band , 可以解決字段名重復的問題, 當然page header也不要顯示了. 如果需要, 可以把title bandprint when expression設成只有輸出Excel的時候才顯示為什么Excel 里面的數據是從第二行,B列開始顯示的。

    因為第一行和第A列分別是用來表示page top margin page left margin.對于Excel 來說, 純粹多余. 解決方法是把page margin 設成0. 不過如果這個report 還需要以PDF 等顯示, 那么設成0 就不好看了. 最好能動態的改變pagemargin. 當然,這個改變只能在外部(調用eport 的地方) 進行, 在設計Report 的時候是無能為力的. 不幸的是, JasperReport 類居然沒有setMargin 的方法,只有getter.折中的方法只能是reflect . 代碼示意如下:

    //use reflect to set the private field of JRBaseReport

    java.lang.reflect.Field margin =

    JRBaseReport.class.getDeclaredField("leftMargin");

    margin.setAccessible(true);

    margin.setInt(jasperReport,0);

    margin =

    JRBaseReport.class.getDeclaredField("topMargin");

    margin.setAccessible(true);

    margin.setInt(jasperReport,0);

    margin =

    JRBaseReport.class.getDeclaredField("bottomMargin");

    margin.setAccessible(true);

    margin.setInt(jasperReport, 0);

    如何去掉Excel 中隱藏的行

    如前說述, 由于page break 的關系, Excel 中每隔幾十行,就有一個高度為0 row, 即使把page botom margin設為0, page footer去掉都沒有辦法. 唯一的解決辦法是把page height 設為很大. 同上面一樣, 不得不使用reflect:

    java.lang.reflect.Field pageHeight=

    JRBaseReport.class.getDeclaredField("pageHeight");

    pageHeight.setAccessible(true);

    pageHeight.setInt(myRpt, Integer.MAX_VALUE);

    八、HTMLBar3D圖表輸出心得

    圖表在ireport中是利用其他開源包生成的圖片插入而生成,本人使用的版本是使用jfreechart1.0.0開源包實現。Ireportjfreechart的支持不算完美,只是實現了部分的圖表生成,但對于一般項目,也是足夠用的。

    對于圖表的數據來源,和報表一樣,也有多種來源,并不局限于數據庫,而本人推薦的依然是javabean。用戶只要在定義好圖表的各項數據(比如:橫坐標數據,縱坐標數據,橫坐標標簽,縱坐標標簽,分類標準等等)jasperreport+jfreechart會自動進行數據的分類統計輸出,這點是很人性化的。

    看過jasperreport的源代碼,發現,圖表在HTML格式輸出的時候,首先是輸出一張圖片,或者放在具體目錄下,或者放在臨時的response里,然后進行調用、輸出展示。(如果選用后者的輸出方式,需要注意:1.x版本后的輸出需要對web.xml進行配置,配置一個servlet進行輸出)這樣就造成了一個問題,就是當多用戶同時訪問頁面的時候,用戶看到的數據是正確的,但是圖片卻可能是別人產生的圖片!

    這可能是由于HTML瀏覽器對圖片的引用時機不對,解決的方案是這樣的:由于HTML格式的輸出是字符形式的(PDF是二進制流形式的),所以我們選擇首先把整個圖表輸出到字符緩沖區中,然后進行一次性輸出,這樣,我們輔助瀏覽器完成對圖片引用時機的修正。當然,也可以這樣做:通過修改源代碼,把圖片輸出到不同的臨時目錄,這樣的話,想引用錯基本都不可能了J

    HTML輸出的時候,一定要記得設置編碼格式,通過exporterCHARACTER_ENCODING屬性來設置。而且,在HTML中輸出的時候,可以不對報表進行分頁操作,即取消分頁。

    還有,jfreechart默認輸出的圖片是進行抗鋸齒處理過的。對于圖形來說,這樣會讓圖像顯示的更圓潤,而對于文字來說,可能就會顯示變得模糊。解決方案:修改源代碼。可以修改jasperreport的源代碼,也可以修改jfreechart的源代碼,只需按照如下代碼進行改進即可:

    jfreechart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

    上面的代碼將圖片輸出的文本抗鋸齒關閉,而圖像依然有抗鋸齒處理,所以圖片相對好看。不過,有一點需要注意:字體盡量是宋體,字號最好在1214之間,這樣能達到最好的顯示效果。

    posted on 2013-08-29 10:46 rogerfan 閱讀(4107) 評論(0)  編輯  收藏 所屬分類: 【Java知識】【開源技術】
    主站蜘蛛池模板: 美女网站免费福利视频| 亚洲另类古典武侠| AV免费网址在线观看| 大地资源网高清在线观看免费| 亚洲av产在线精品亚洲第一站| 久久亚洲国产精品123区| 四虎成人免费影院网址| 久久青草免费91观看| 91av免费在线视频| 校园亚洲春色另类小说合集 | 风间由美在线亚洲一区| 亚洲国产精品成人综合久久久 | 未满十八私人高清免费影院| 亚洲国产精品无码久久久秋霞1| 精品亚洲国产成AV人片传媒| 国产AV无码专区亚洲AVJULIA| 婷婷综合缴情亚洲狠狠尤物| 色吊丝最新永久免费观看网站| 四虎永久在线精品免费观看视频| 久久免费观看国产精品| 黄网站免费在线观看| 中文字幕在线观看免费| 人妖系列免费网站观看| 色爽黄1000部免费软件下载| 亚洲aⅴ无码专区在线观看| 自拍偷区亚洲国内自拍| 亚洲乱码在线卡一卡二卡新区| 亚洲国色天香视频| 亚洲H在线播放在线观看H| 亚洲人成网网址在线看| 亚洲不卡中文字幕| 国产 亚洲 中文在线 字幕| 亚洲中文字幕久久精品蜜桃| 色婷五月综激情亚洲综合| 国产亚洲精品VA片在线播放| 国产成人精品日本亚洲18图| 亚洲国产精品一区二区三区在线观看| 亚洲制服丝袜第一页| 亚洲色大网站WWW永久网站| 亚洲人成人无码.www石榴| 久久久久亚洲国产AV麻豆|