Heis的Blog

          保持簡(jiǎn)單,保持愚蠢
          隨筆 - 29, 文章 - 1, 評(píng)論 - 122, 引用 - 0
          數(shù)據(jù)加載中……

          JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表

              最近在想《JasperReport那些事兒》系列的寫(xiě)作方向的問(wèn)題,是要先寫(xiě)Jasper的原理和基礎(chǔ)方面,還是寫(xiě)怎么制作報(bào)表實(shí)例。如果你想我寫(xiě)一些你感興趣的部分,可以在文章后面加評(píng)論告訴我。這周先寫(xiě)一篇制作報(bào)表實(shí)例的文章吧。
              最近在blogjava看到一篇總結(jié)報(bào)表圖例的文章http://www.aygfsteel.com/report9d/archive/2009/03/04/257848.html??偨Y(jié)的相當(dāng)不錯(cuò),如果你不知道什么是標(biāo)簽式報(bào)表,可以看看。

          1.先上效果圖


          2.數(shù)據(jù)源還是沿用NameList XML數(shù)據(jù)源,關(guān)于怎么配置數(shù)據(jù)源可以看這里。
          <?xml version="1.0" encoding="utf-8" ?>
          <NameList>
              
          <Person>
                  
          <Name>強(qiáng)尼</Name>
                  
          <Gender></Gender>
                  
          <Age>56</Age>
              
          </Person>
              
          <Person>
                  
          <Name>阿美</Name>
                  
          <Gender></Gender>
                  
          <Age>23</Age>
              
          </Person>
              
          <Person>
                  
          <Name>李麗</Name>
                  
          <Gender></Gender>
                  
          <Age>58</Age>
              
          </Person>
              
          <Person>
                  
          <Name>杰森</Name>
                  
          <Gender></Gender>
                  
          <Age>32</Age>
              
          </Person>
              
          <Person>
                  
          <Name>劉三</Name>
                  
          <Gender></Gender>
                  
          <Age>21</Age>
              
          </Person>
          </NameList>  

          3.制作報(bào)表的思路
            在制作標(biāo)簽報(bào)表的時(shí)候,我們先來(lái)理清一下思路??梢园l(fā)現(xiàn),其實(shí)標(biāo)簽式報(bào)表的每個(gè)小標(biāo)簽內(nèi)的內(nèi)容類(lèi)型都是一樣的,這樣可以認(rèn)為報(bào)表是由多個(gè)標(biāo)簽組成的。這樣就可以分離出主體報(bào)表和子報(bào)表的概念,這與Jasperreport里的subreport(子報(bào)表)概念是一樣的。這樣就可以大概抽象出一個(gè)標(biāo)簽式報(bào)表的模型了,在主體報(bào)表上使用兩個(gè)subreport元素指向同一個(gè)標(biāo)簽報(bào)表。

            那為什么要使用兩個(gè)subreport元素?我們先來(lái)看我們期待輸出的標(biāo)簽?zāi)P偷捻樞颉?br />
            但是在Jasperreport里,報(bào)表的渲染是從上到下的。所以我們期待的順序是先渲染1號(hào)標(biāo)簽,然后渲染2號(hào)標(biāo)簽,這是從左到右的渲染,在Jasperreport里面是做不到的。但是我們可以采用同時(shí)渲染1號(hào)和2號(hào)標(biāo)簽,這就需要兩個(gè)subreport元素。
          4.具體步驟(關(guān)于子報(bào)表的制作,可以參考我的第一篇文章)
          a)建立一個(gè)主模板,加入兩個(gè)subreport。

          b)建立一個(gè)子模板(標(biāo)簽?zāi)0澹?/span>


          c)配置subreport的XPATH。
          左邊的subreport的Datasource配置

          右邊的subreport的Datasource配置


          報(bào)表模板下載:http://www.aygfsteel.com/Files/heis/%E5%9B%9B-%E5%88%B6%E4%BD%9C%E6%A0%87%E7%AD%BE%E5%BC%8F%E6%8A%A5%E8%A1%A8/Chapter4.zip



          程序員的一生其實(shí)可短暫了,這電腦一開(kāi)一關(guān),一天過(guò)去了,嚎;電腦一開(kāi)不關(guān),那就成服務(wù)器了,嚎……

          posted on 2009-03-08 15:33 Heis 閱讀(4200) 評(píng)論(12)  編輯  收藏 所屬分類(lèi): JasperReport那些事兒

          評(píng)論

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表[未登錄](méi)  回復(fù)  更多評(píng)論   

          看了大大的四篇,發(fā)現(xiàn)自己的問(wèn)題有了解決方法,大大是把查詢(xún)結(jié)果弄成XML數(shù)據(jù)源,然后再把它們讀取到報(bào)表,這就解決了直接對(duì)數(shù)據(jù)庫(kù)綁定數(shù)據(jù)源造成無(wú)法對(duì)條件搜索進(jìn)行報(bào)表了。這樣又要涉及XML的讀寫(xiě)問(wèn)題,如果我的數(shù)據(jù)有好幾萬(wàn)條一次性寫(xiě)入XML不知道會(huì)不會(huì)效率有問(wèn)題,我第一次接觸報(bào)表,請(qǐng)多多指教,謝謝
          2009-03-09 09:16 | 游上岸的魚(yú)

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          @游上岸的魚(yú)
          使用XML作為數(shù)據(jù)源比直接讀取數(shù)據(jù)庫(kù)更有優(yōu)勢(shì)的地方在于:
          1.數(shù)據(jù)可以在程序里處理;
          2.數(shù)據(jù)獨(dú)立性和可讀性好

          但是劣勢(shì)也是很明顯的,因?yàn)橐獜臄?shù)據(jù)庫(kù)讀取數(shù)據(jù)到對(duì)象,對(duì)象再轉(zhuǎn)換為XML,這個(gè)過(guò)程消耗的資源要更多,效率也會(huì)受到影響。具體的效率我也沒(méi)測(cè)試過(guò),但是我在項(xiàng)目里生成的XML在一萬(wàn)行左右時(shí),效率是可以接受的。
          但是對(duì)于效率要求比較高的報(bào)表,但是數(shù)據(jù)不需要做中間處理的報(bào)表,我并不推薦XML作為數(shù)據(jù)源這種方式。
          2009-03-09 10:20 | Heis

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          這樣的報(bào)表做起來(lái)很麻煩,而且多個(gè)子報(bào)表效率無(wú)疑會(huì)很底,樓主有沒(méi)有想過(guò)jasperReport的API支持多結(jié)果集的報(bào)表,也就是針對(duì)報(bào)表上不同的塊解釋不同的SQL填充?而且樓主所說(shuō)的標(biāo)簽式報(bào)表完全可以通過(guò)簡(jiǎn)單的一個(gè)jrxml文件通過(guò)分欄操作完成
          2009-03-09 17:08 | 凌晨風(fēng)

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          @凌晨風(fēng)
          首先,針對(duì)你說(shuō)的“報(bào)表做起來(lái)很麻煩”。我前面的文章有說(shuō)過(guò),以XML作為數(shù)據(jù)源是針對(duì)不同的需求的,請(qǐng)考慮下面的幾種情況:如果你的報(bào)表數(shù)據(jù)要經(jīng)過(guò)一系列的精確計(jì)算,然后在報(bào)表上展示計(jì)算結(jié)果;如果你的報(bào)表數(shù)據(jù)并不是全部都來(lái)自于數(shù)據(jù)庫(kù),而是某些來(lái)自程序或其他配置文件;SQL能不能解決問(wèn)題?

          其次,我不能認(rèn)同“多個(gè)子報(bào)表效率無(wú)疑會(huì)很底”這句話。標(biāo)簽式報(bào)表主體報(bào)表的subreport元素都是指向相同的子報(bào)表模板。這相當(dāng)于java中一個(gè)類(lèi)調(diào)用同一個(gè)類(lèi)的多個(gè)實(shí)例,這樣并不會(huì)有效率問(wèn)題。使用“無(wú)疑”這個(gè)詞并不是程序員應(yīng)有的素質(zhì),至少你應(yīng)該先去運(yùn)行一下這個(gè)報(bào)表。

          我猜想你說(shuō)的“多結(jié)果集”是指subdatasets,這個(gè)是只適用于連接(Connection)類(lèi)型的數(shù)據(jù)集(像數(shù)據(jù)庫(kù),Hibernate之類(lèi)),并不適用于數(shù)據(jù)源(Data Source)類(lèi)型的數(shù)據(jù)集(像XML,CSV之類(lèi))。

          對(duì)于你的“分欄”操作,我并不是很理解,請(qǐng)賜教。
          2009-03-09 20:00 | Heis

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表[未登錄](méi)  回復(fù)  更多評(píng)論   

          感覺(jué)這樣介紹沒(méi)實(shí)際意義 因?yàn)镴asperReport并不適合中國(guó)的報(bào)表,很多都做不出來(lái),建議你看看潤(rùn)乾報(bào)表,不要在這里給大家推薦一個(gè)不適合中國(guó)的報(bào)表!
          2009-03-10 08:52 | john

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          @Heis
          博主說(shuō)的很有道理,需求不同,中國(guó)式復(fù)雜的報(bào)表的確做起來(lái)很麻煩.
          我也是發(fā)表一下個(gè)人意見(jiàn)而已.大家共同學(xué)習(xí)啊!
          我接觸過(guò)jasper的api,底層針對(duì)子報(bào)表采用io加載,編譯jasper文件,之后.java文件,博主可以跟蹤調(diào)試一下多子報(bào)表的例子看看,程序運(yùn)行時(shí)會(huì)在你的硬盤(pán)上寫(xiě)文件之后編譯加載到內(nèi)存后刪除掉,放開(kāi)底級(jí)別的日志就可以看出來(lái).
          我們的系統(tǒng)是跑在局域網(wǎng)的,運(yùn)行起來(lái)都不是很理想.至于報(bào)表上展示的數(shù)據(jù)和圖表等等需要特殊經(jīng)過(guò)計(jì)算的數(shù)據(jù)我是采用scriplet處理,而底層只需要一個(gè)簡(jiǎn)單的connection就可以(主要是考慮到我們的報(bào)表系統(tǒng)是給用戶使用的,而用戶只會(huì)一些簡(jiǎn)單的sql,配上我們封裝的scriplet就可以達(dá)到想要的效果).
          關(guān)于那個(gè)"分欄",我是看了這個(gè)效果圖才有此說(shuō)法,至于是不是和你的需求一致那大家就應(yīng)該多交流了:先說(shuō)說(shuō)我的想法:分成兩列橫著打印就可以出現(xiàn)你要的這種效果圖,不知道博主是不是這個(gè)意思?學(xué)習(xí)學(xué)習(xí)!
          2009-03-10 09:04 | 凌晨風(fēng)

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          @john
          JasperReport不是不適合中國(guó)報(bào)表,只是它不是為中國(guó)報(bào)表而設(shè)計(jì)!jasperReport功能很強(qiáng)大,只要你有想象力完全可以定制所需要的報(bào)表,關(guān)鍵是它開(kāi)源,是一個(gè)純java報(bào)表,如果你是跨系統(tǒng)那么它是首選,前提是你有足夠的時(shí)間和耐心哦
          2009-03-10 09:11 | 凌晨風(fēng)

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          @john
          那你的意思是適合中國(guó)的報(bào)表才有意義?那什么是中國(guó)式的報(bào)表呢?
          2009-03-10 19:18 | Heis

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          @凌晨風(fēng)
          “分成兩列橫著打印”是不是指像我現(xiàn)在的報(bào)表逆時(shí)針轉(zhuǎn)90度。如果是,那在Jasperreport里是做不到的。文章中也有提及,Jasperreport是只能一個(gè)區(qū)域(band)一個(gè)區(qū)域地去渲染,因?yàn)閰^(qū)域的排列是由上到下,所以渲染的順序也是從上到下的,沒(méi)辦法從左到右渲染。
          2009-03-10 19:26 | Heis

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          不是指報(bào)表逆時(shí)針轉(zhuǎn)90度,而是數(shù)據(jù)橫向排列
          2009-03-11 08:52 | 凌晨風(fēng)

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          JasperReport似乎支持橫向label
          http://jasperforge.org/website/jasperreportswebsite/trunk/samples.html?group_id=252
          2009-08-02 15:23 | caper

          # re: JasperReport那些事兒(四)——制作標(biāo)簽式報(bào)表  回復(fù)  更多評(píng)論   

          blog的布局和字體怎么這么難看?
          2009-11-10 10:45 | yzc
          主站蜘蛛池模板: 望江县| 建瓯市| 望城县| 水城县| 建德市| 山东省| 杂多县| 西乌| 丰原市| 天峻县| 宜昌市| 玉田县| 思南县| 辽阳县| 清涧县| 栖霞市| 普陀区| 永德县| 安达市| 喜德县| 布尔津县| 虹口区| 菏泽市| 兰州市| 朔州市| 张家口市| 沂南县| 济源市| 文昌市| 桐梓县| 普宁市| 随州市| 本溪| 镇沅| 筠连县| 仙居县| 子洲县| 三台县| 闵行区| 比如县| 永济市|