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

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

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

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825594
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

    文章來源:ttp://blog.163.com/liushuo216@126/blog/static/1814432020087534517426/

    一、iReportJasperReport簡介

    1.1   簡介

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

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

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

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

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

    JasperReport做報表時用的都是底層的東西,如線條、靜態(tài)文本等,底層的好處就是強大、容易控制報表,但缺點就是編寫很麻煩。慶幸的是,我們有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/下載

    本人用的產(chǎn)品版本:iReport 2.0.5-windows版本;JasperReport 2.0.5版本;JDK 1.5.0_4版本。

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

    2.2 安裝軟件

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

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

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

    2.3 其他相關

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


    三、iReport的基本使用

    先看使用界面:

    下面開始初步嘗試。

    1.      新建報表

    彈出對話框如下:

     

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

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

    2.      報表的結構

    新建的報表如下:

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

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

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

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

    ·detial:放置需要循環(huán)輸出的數(shù)據(jù),比如銷售記錄數(shù)據(jù)。

    ·columnFooter:放置列級別的統(tǒng)計計算值或是列的說明。

    ·pageFooter:放置頁級別的統(tǒng)計值或是頁的說明。

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

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

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

    ·Groupfooter:放置組的統(tǒng)計或是說明

    3.      添加對象

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

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

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

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

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

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

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

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

    對于動態(tài)對象,屬性如下。

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

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

    4.      設置數(shù)據(jù)來源

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

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

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

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

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

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

    5.      變量、參數(shù)及字段

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

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

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

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

                變量

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

    彈出如下對話框:

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

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

                參數(shù)

    定義參數(shù)的按鈕就在定義變量的旁邊,如上節(jié),不贅述。

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

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

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

                字段

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

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

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

    6.      動態(tài)數(shù)據(jù)源

    從上圖中,選擇默認的動態(tài)連接。

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

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

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

    7.     

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

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

    8.      風格化

    如圖。

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

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

    9.      界面介紹

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

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

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

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

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

    10.預覽

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

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

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

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

    四、報表的輸出

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

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

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

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

    1)        讀取.jasper文件

    通過iReport軟件,我們可以把已經(jīng)定義好的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)        建立數(shù)據(jù)源

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

    這里,我們介紹兩種普遍數(shù)據(jù)源:數(shù)據(jù)庫ConnectionJavaBean

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

    一、

    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類,其中包含一個靜態(tài)的方法,返回Collection類型或者Array類型的JavaBean結果集。相比較Connection來說,JavaBean要麻煩許多,不過也要靈活許多,這才是靈活性的體現(xiàn)(因為有時候,查詢語句會很復雜,數(shù)據(jù)來源一樣會很復雜,而JavaBean無視這一切)JavaBean代碼如下:

    JRBeanCollectionDataSource dataSource;

            Collection rows = NumFactory.generateCollection();

            dataSource = new JRBeanCollectionDataSource(rows);

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

    4)        生成JasperPrint對象

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

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

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

    5)        輸出

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

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

    exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);

            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);

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

    五、例子

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

    然后是運行之后的截圖:

    六、獨立性與易集成性

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

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

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

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

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

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

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

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

    七、其他相關問題

    如何使用圖片?

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

    動態(tài)控制Field 是否顯示

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

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

    使用圖片類似,最好使InputStream 或者傳入?yún)?shù)。

    Query里面如何使用參數(shù)

    $P!{xxx} 或者$P{xxx} 后者能用于類似PreparedStatement參數(shù), 而前者可替換Sql 的任意部分. 在需要動態(tài)排序的時候, 前者特別有用. 比如select a,b,c from t order by $P!{orderClause} $P 還是$P!, SQL是以PreparedStatement 式執(zhí)行的, 不必太擔心性能問題注意:參數(shù)是不能嵌套,比如$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的簡單, 處理完后, 游標已經(jīng)到了eof 置了, 在開始處理第二張圖的時候,就必然游標耗盡異常! ?自己JRDataSourceAdapter,JRDataSource里面的預先保存到一個Collection (相當于一個Offline的數(shù)據(jù)), 然后這個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 邊框在鼠標點中的時候顯示色,否則是) 最后,得設置參數(shù)

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

    如何保留GridLine

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

    如何使字段名只顯示一次

    如果把字段名放在ColumnHead 區(qū)域, 那么輸出到Excel, 會每個Page 都顯示一遍. 在設計Report 時候, 一般會設定Page 大小. 然而對于Excel, 這個Page設定仍然存在,而且往往很討厭, 因為在Excel , 通常希望得到連續(xù)的數(shù)據(jù), 然而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 里面的數(shù)據(jù)是從第二行,B列開始顯示的。

    因為第一行和第A列分別是用來表示page top margin page left margin.對于Excel 來說, 純粹多余. 解決方法是把page margin 設成0. 不過如果這個report 還需要以PDF 等顯示, 那么設成0 就不好看了. 最好能動態(tài)的改變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開源包實現(xiàn)。Ireportjfreechart的支持不算完美,只是實現(xiàn)了部分的圖表生成,但對于一般項目,也是足夠用的。

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

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

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

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

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

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

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



    posted on 2008-11-09 09:55 Ke 閱讀(8195) 評論(0)  編輯  收藏 所屬分類: iReport
    主站蜘蛛池模板: 免费黄色电影在线观看| 精品国产呦系列在线观看免费 | 在线看片免费人成视频福利| 免费人成在线观看视频高潮| 在线看无码的免费网站| 精品久久久久国产免费| 亚洲av无码国产精品色在线看不卡| 亚洲精品无码你懂的网站| 亚洲国产精品一区二区成人片国内| 亚洲毛片基地日韩毛片基地| 亚洲精品9999久久久久无码 | 青青久久精品国产免费看| 韩日电影在线播放免费版| 亚洲免费福利视频| 成年女人永久免费观看片| 亚洲午夜未满十八勿入网站2| 亚洲欧洲国产视频| 粉色视频免费入口| 免费观看男人吊女人视频| 成人毛片免费观看视频| 国产亚洲AV夜间福利香蕉149| 亚洲国产综合精品| 一级毛片免费播放试看60分钟| 亚洲永久精品ww47| 永久免费bbbbbb视频| 77777亚洲午夜久久多人| 亚洲人成在线中文字幕| 人成午夜免费大片在线观看| 99视频免费播放| 亚洲AV蜜桃永久无码精品| 亚洲高清无在码在线无弹窗 | 三级毛片在线免费观看| 无人在线观看完整免费版视频| 亚洲片一区二区三区| 91亚洲自偷在线观看国产馆| a毛片成人免费全部播放| 免费人成网站在线观看10分钟| 国产成人亚洲精品91专区手机| 亚洲伊人久久大香线蕉结合| 久久99精品免费一区二区| 免费高清资源黄网站在线观看|