上一篇主要介紹了使用jxl生成報(bào)表的代碼模板以及獲取報(bào)表數(shù)據(jù)的一種處理方式,本篇將通過兩個(gè)復(fù)雜報(bào)表案例的分析,來告訴大家如何實(shí)現(xiàn)。 案例1: 車站區(qū)間材料供應(yīng)情況報(bào)表,它的查詢條件為年度,工程,材料類別,報(bào)表的標(biāo)題會(huì)加上這些查詢條件作為最終報(bào)表標(biāo)題。無圖無真相,讓我們來看看生成后的效果:

該報(bào)表有這樣幾個(gè)特點(diǎn):1)表頭的從5月計(jì)量到12月計(jì)量是根據(jù)查詢條件的年度和工程動(dòng)態(tài)取出來的,因此模板中不會(huì)定義6-13列。2)數(shù)據(jù)顯示上有好幾個(gè)分類,首先按供貨商分,每個(gè)供貨商下面,再按月根據(jù)實(shí)際的供貨數(shù)量再進(jìn)行劃分。3)需要對(duì)每個(gè)供貨商每個(gè)月的材料進(jìn)行小計(jì),如果有多個(gè)供貨月,還要將本月與之前月的供貨數(shù)量進(jìn)行合計(jì)。
這是大象2008年做的一個(gè)工程項(xiàng)目,是該項(xiàng)目中比較有代表性的一個(gè)報(bào)表,所有與工程相關(guān)的項(xiàng)目在業(yè)務(wù)上還是比較相似的,因?yàn)樗幸惶追浅3墒斓臉?biāo)準(zhǔn)與規(guī)范。至于這些業(yè)務(wù)數(shù)據(jù)的表設(shè)計(jì)是什么樣的,大家不需要了解,我主要根據(jù)它的業(yè)務(wù)特點(diǎn)來說說思路。 我將這個(gè)報(bào)表進(jìn)行分解,看看到底要準(zhǔn)備什么數(shù)據(jù),特別注意這些數(shù)據(jù)是和年度,工程,材料類別這些查詢條件緊密關(guān)聯(lián)的。PS:甲供材料與甲控材料都是工程上的名詞,不寫清楚會(huì)對(duì)了解該行業(yè)的人產(chǎn)生誤解。 1、表頭的計(jì)量月份。 2、甲供材料供應(yīng)商信息。 3、甲供材料供應(yīng)月份(第2列)。
4、甲供材料數(shù)據(jù)(第3-5列)。 5、甲供材料每個(gè)月的計(jì)量值(與表頭的計(jì)量月份對(duì)應(yīng))。 6、每月的小計(jì)和合計(jì)。
處理這類復(fù)雜報(bào)表,首先需要搞清楚它的業(yè)務(wù)關(guān)系,這個(gè)非常關(guān)鍵,如果你連這些業(yè)務(wù)都沒弄明白就開始動(dòng)手做,最后肯定是會(huì)有問題的。只有在明白這些關(guān)聯(lián)關(guān)系之后,我們才能接著做第二步工作,分解數(shù)據(jù),研究數(shù)據(jù)來源,比如我上面寫的1-6點(diǎn),這些業(yè)務(wù)數(shù)據(jù)都分別在哪些表里面,哪些是可以直接取到的,哪些又必須是要經(jīng)過計(jì)算才能得到的。比如那個(gè)剩余數(shù)量,小計(jì),合計(jì)這些明顯都是在基礎(chǔ)數(shù)據(jù)上計(jì)算出來的。要清楚的知道,每個(gè)Cell里面是不是有內(nèi)容,并且內(nèi)容來源是不是正確的?就算你對(duì)自己非常有信心,還是請(qǐng)多核對(duì)檢查,認(rèn)真對(duì)待工作是不會(huì)有錯(cuò)的。
前兩步的思想是比較通用的,但第三步,也就是最重要也是最麻煩的獲取數(shù)據(jù),我不想針對(duì)案例報(bào)表說具體的步驟,那樣就太狹隘了。這一步的解決辦法有很多,我在第一篇里也曾經(jīng)提到過,不管是代碼式還是SQL式還是分而治之式,總之要盡可能的減少數(shù)據(jù)庫(kù)訪問次數(shù)。看到這里,可能有人要吐槽了,這不是說了跟沒說一樣嗎?大象根據(jù)多年的經(jīng)驗(yàn),很真誠(chéng)很真誠(chéng)的告訴你,如果你能夠做好第一步和第二步工作,那么你離完成報(bào)表也差不了多少了,其實(shí)第三步只是需要一些編程能力與SQL能力,以及在運(yùn)用這些能力之前結(jié)合業(yè)務(wù)與報(bào)表的數(shù)據(jù)做一些優(yōu)化方面的工作。永遠(yuǎn)記住,盡可能的減少訪問數(shù)據(jù)庫(kù)次數(shù)。 最后一步當(dāng)然是生成報(bào)表了,這里我想多說一句,報(bào)表的樣式一般都是客戶給的,因?yàn)樵谟孟到y(tǒng)導(dǎo)出報(bào)表前,肯定是先手動(dòng)做的,因此樣式上一定要跟用戶的保持一致,這些東西最后客戶那里會(huì)歸檔,領(lǐng)導(dǎo)也會(huì)看還要簽字,作批示什么的。就像案例1的報(bào)表,它的樣式就是完全按照客戶給的來設(shè)定。 在寫填充數(shù)據(jù)的代碼之前,先確保表頭已經(jīng)沒問題,像案例1這種動(dòng)態(tài)表頭就必須要用代碼來實(shí)現(xiàn),在模板中是不可能預(yù)先定義好的。然后就是你所準(zhǔn)備的數(shù)據(jù)模型是否能夠幫助你處理邏輯上的一些控制。比如像供應(yīng)商填充,小計(jì),合計(jì),還有普通數(shù)據(jù),要讓for循環(huán)里面的代碼知道,每循環(huán)一次,相應(yīng)的數(shù)據(jù)應(yīng)該出現(xiàn)在哪些單元格中,你需要時(shí)刻計(jì)算一下當(dāng)前數(shù)據(jù)與所對(duì)應(yīng)的Cell是否一致。最后就是注意一些常識(shí)性的細(xì)節(jié),比如上面留空白的地方,對(duì)于12月份供應(yīng)的材料來說,它之前的月份是肯定不會(huì)有使用記錄的,如果最后生成的報(bào)表中,像這類位置出現(xiàn)了數(shù)值,那你就要好好檢查一下了,這里留白也是因?yàn)榭蛻舻膱?bào)表是這樣做的。
案例2: xx市城建局工程招標(biāo)結(jié)果匯總表,查詢條件為工程編號(hào),工程名稱,工程科室。大標(biāo)題可以預(yù)先填好,但第2行用xxx標(biāo)示的內(nèi)容就是動(dòng)態(tài)修改的,而且報(bào)表最終打印出來后是要給領(lǐng)導(dǎo)簽字的,這就是明顯的要按用戶格式來。 
這個(gè)報(bào)表來自于2009年的一個(gè)項(xiàng)目,相比第1個(gè)我認(rèn)為要簡(jiǎn)單一些,從業(yè)務(wù)上講,就是工程項(xiàng)目的招投標(biāo)流程的歸納與體現(xiàn)。可以把數(shù)據(jù)分解為: 1、工程項(xiàng)目信息(工程編號(hào)與工程名稱)。 2、招投標(biāo)信息(分中標(biāo)和流標(biāo)再中標(biāo)兩種)。 3、合同信息(合同簽訂時(shí)間,原報(bào)表還有好幾列關(guān)于合同的數(shù)據(jù),如果都保留圖顯得太大了)。 這個(gè)報(bào)表的處理步驟和前一個(gè)一樣,就不再贅述了。需要注意的是,在準(zhǔn)備數(shù)據(jù)的時(shí)候,想想類似工程編號(hào)與工程名稱這種Cell,如何知道要合并幾行單元格(或者不合并)。完成之后多找些有效數(shù)據(jù)來測(cè)試。 另外我還想談下查詢條件,比如案例1中的年度、工程、材料類別,案例2的工程編號(hào),工程名稱,工程科室。因?yàn)椴樵儣l件的多少以及對(duì)條件的限制情況會(huì)直接影響到報(bào)表數(shù)據(jù)的獲取。這些東西是可以和客戶溝通的,千萬(wàn)不要把客戶的訴求當(dāng)需求,他們因?yàn)椴欢_發(fā),只從業(yè)務(wù)的角度考慮問題,而且很多時(shí)候提出的要求是直接拍腦袋說的,他們要么希望大而全,恨不得把報(bào)表里面所有的列都作為查詢條件;要么希望少而精,很少條件或不要查詢條件。不管哪一個(gè)都不是我們希望的,這時(shí)候需要多溝通,在需求與系統(tǒng)之間找到一個(gè)平衡。 感謝大家耐著性子看到這里,期望通過這兩篇文章的介紹,能夠?qū)Υ蠹矣兴鶐椭瑢?duì)于開發(fā)復(fù)雜報(bào)表起到一個(gè)拋磚引玉的作用。如果大象有說的不對(duì)的地方,還請(qǐng)各位指出來,在下感激不盡! 本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。http://www.tkk7.com/bolo
posted on 2014-01-09 14:16
菠蘿大象 閱讀(2686)
評(píng)論(0) 編輯 收藏 所屬分類:
Java