專利名稱::一種報(bào)表的生成方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及電子表格,更具體地說(shuō),涉及一種報(bào)表的生成方法。
背景技術(shù):
:電子表格是一種在日常工作中經(jīng)常使用的工具,其使用的方便程度經(jīng)常影響使用者對(duì)其所在的運(yùn)用系統(tǒng)的評(píng)價(jià)。目前應(yīng)用系統(tǒng)在制作報(bào)表時(shí),一般有這樣幾種方法一種方法是使用POI,JXL等Excel驅(qū)動(dòng)程序,生成Excel報(bào)表對(duì)象,然后向指定的單元格寫(xiě)入數(shù)據(jù),最后保存為Excel報(bào)表文件。但這種方法,程序不僅要提供數(shù)據(jù),還要控制各區(qū)段的生成以及報(bào)表樣式、格式,程序代碼量大且不直觀。在報(bào)表樣式改變時(shí)需要改動(dòng)代碼。另一種方法是使用第三方的報(bào)表工具,如iReport,Birt等。這些工具自帶設(shè)計(jì)器,可定義報(bào)表的樣式,輸出格式,數(shù)據(jù)綁定。在運(yùn)行時(shí)驅(qū)動(dòng)報(bào)表引擎生成報(bào)表對(duì)象,然后提供數(shù)據(jù)給報(bào)表對(duì)象即可生成所需報(bào)表,并且報(bào)表輸出支持各種格式。但這種方式需要專用的報(bào)表設(shè)計(jì)工具,這些報(bào)表設(shè)計(jì)工具操作起來(lái)比較復(fù)雜,并且報(bào)表模板的設(shè)計(jì)也不是基于Excel表格方式的。不方便大部分操作人員的使用。
發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問(wèn)題在于,針對(duì)現(xiàn)有技術(shù)的上述需要改動(dòng)代碼、使用不方便或操作較為復(fù)雜的缺陷,提供一種基本不需要改動(dòng)代碼、使用方便以及操作筒單的一種報(bào)表的生成方法。本發(fā)明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是構(gòu)造一種報(bào)表的生成方法,所述每種報(bào)表包括一個(gè)模板文件和一個(gè)樣式文件,還包括如下步驟A)構(gòu)造與每種報(bào)表模板,得到與該報(bào)表對(duì)應(yīng)的模板文件和樣式文件,并存儲(chǔ);B)選擇報(bào)表種類,并讀取與報(bào)表對(duì)應(yīng)的模板文件和樣式文件,加載報(bào)表模板;C)生成報(bào)表,并輸出。在本發(fā)明所述的報(bào)表的生成方法中,所述步驟A)進(jìn)一步包括Al)用Excel得到所需報(bào)表模板樣式,生成Excel格式的模板文件;A2)定義所述報(bào)表模板樣式中的各區(qū)段,生成樣式文件。在本發(fā)明所述的報(bào)表的生成方法中,步驟A2)中所述定義各區(qū)段包括定義各區(qū)段中所要放置的數(shù)據(jù)項(xiàng)、所述數(shù)據(jù)項(xiàng)的位置以及所述數(shù)據(jù)項(xiàng)的顯示格式,所述生成樣式文件包括將上述信息記錄在所述樣式文件中。在本發(fā)明所述的報(bào)表的生成方法中,所述模板文件包括.xls文件;所述樣式文件包括.xml文件。在本發(fā)明所述的報(bào)表的生成方法中,所述步驟B)進(jìn)一步包括Bl)讀取所選報(bào)表的樣式文件,解析其定義信息,生成報(bào)表樣式定義對(duì)象;B2)讀取所選報(bào)表的模板文件,讀取其每個(gè)區(qū)段中的合并單元格信自在本發(fā)明所述的才艮表的生成方法中,所述步驟C)進(jìn)一步包括如下步驟Cl)構(gòu)造一個(gè)新報(bào)表,設(shè)置該報(bào)表的輸出路徑;C2)初始化所構(gòu)造的新報(bào)表;C3)生成新區(qū)段;C4)填充所述新區(qū)段,并輸出所述新報(bào)表。在本發(fā)明所述的報(bào)表的生成方法中,所述步驟C2)進(jìn)一步包括C21)由所述報(bào)表模板中復(fù)制其表頭和表尾到所述新報(bào)表;C22)將新區(qū)段插入指針位置設(shè)置在所述表頭和表位之間。在本發(fā)明所述的報(bào)表的生成方法中,所述步驟C)進(jìn)一步包括如下步驟Cl)構(gòu)造一個(gè)新報(bào)表,設(shè)置該報(bào)表的輸出路徑;C2)初始化所構(gòu)造的新報(bào)表;C3)生成新區(qū)段;5.C4)填充所述新區(qū)段,并輸出所述新報(bào)表。在本發(fā)明所述的報(bào)表的生成方法中,所述步驟C4)進(jìn)一步包括如下步驟C41)由所述報(bào)表定義對(duì)象中取得所述報(bào)表中各區(qū)段單元格所對(duì)應(yīng)的數(shù)據(jù)項(xiàng)的定義;C42)從指定的數(shù)據(jù)對(duì)象中獲取數(shù)據(jù);C43)處理所述數(shù)據(jù);C44)將所述處理后得到的數(shù)據(jù)填入其對(duì)應(yīng)的區(qū)段單元格中。在本發(fā)明所述的報(bào)表的生成方法中,步驟C41)中所述數(shù)據(jù)項(xiàng)定義包括數(shù)據(jù)項(xiàng)名稱、所述數(shù)據(jù)項(xiàng)所在的位置以及所述數(shù)據(jù)項(xiàng)的顯示格式。實(shí)施本發(fā)明的報(bào)表的生成方法,具有以下有益效果由于每個(gè)報(bào)表都具有與其對(duì)應(yīng)的模板文件和樣式文件,因此在生成報(bào)表時(shí)其表格與表格中的數(shù)據(jù)是分開(kāi)的,所以就絕大多數(shù)情況而言不需要改動(dòng)代碼、使用方便以及操作簡(jiǎn)單。圖1是本發(fā)明一種報(bào)表的生成方法實(shí)施例的報(bào)表生成流程圖;圖2是所述實(shí)施例的報(bào)表模板生成流程圖;圖3是所述實(shí)施例的報(bào)表模板加載流程圖;圖4是所述實(shí)施例中報(bào)表生成流程圖。具體實(shí)施例方式下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施例作進(jìn)一步說(shuō)明。如圖l所示,在本發(fā)明一種報(bào)表的生成方法實(shí)施例中,從總體上來(lái)看,包括了如下步驟步驟S1構(gòu)造報(bào)表模板,得到其對(duì)應(yīng)的模板文件和樣式文件,存儲(chǔ)這些文件在本步驟中,構(gòu)建供使用者調(diào)用的報(bào)表模板,這些報(bào)表模板是生成報(bào)表的基礎(chǔ),之后的動(dòng)作都是在此基礎(chǔ)上產(chǎn)生的。由于該報(bào)表模板分為模板文件和樣式文件,因此,其產(chǎn)生報(bào)表時(shí),數(shù)據(jù)與報(bào)表式樣是分開(kāi)的,互不相關(guān)的,因此其在絕大多數(shù)情況下不需要改動(dòng)代碼、使用方便以及操作簡(jiǎn)單。至于,產(chǎn)生報(bào)表模板的具體步驟,稍后有更詳細(xì)的描述。步驟S2選擇報(bào)表,加載其模板在本步驟中,上述報(bào)表模板已經(jīng)存在,使用者(通常在終端的瀏覽器上)選擇報(bào)表模板中的一個(gè),并由服務(wù)器中加載該報(bào)表模板(報(bào)表模板存儲(chǔ)在服務(wù)器上)。步驟S3生成報(bào)表,并輸出在加載的報(bào)表模板上進(jìn)行數(shù)據(jù)取得及處理,最后將這些處理后的數(shù)據(jù)填入對(duì)應(yīng)單元,生成報(bào)表,并輸出該報(bào)表。圖2示出了上述步驟S1中報(bào)表模板生成的具體步驟,在圖2中,包括步驟Sll用Excel得到報(bào)表模板的樣式,生成模板文件在本實(shí)施例中,每個(gè)報(bào)表模板都需要一個(gè)模板文件(Excel文件)和一個(gè)樣式文件(XML文件),在本步驟中,就是使用Excel畫(huà)出一個(gè)報(bào)表模式,這就得到一個(gè).xls格式的模板文件。步驟S12定義上述模板的樣式中的區(qū)段,生成樣式文件在本步驟中,將上述模板分好各個(gè)區(qū)段,設(shè)定每個(gè)區(qū)段中要放置的數(shù)據(jù)項(xiàng)。以及數(shù)據(jù)項(xiàng)的位置,顯示格式等。將這些配置信息記錄在文件中。生成一個(gè)樣式文件(xml文件)。通過(guò)上述步驟S11和步驟S12,得到一個(gè)完整的、包括了模板文件和樣式文件的報(bào)表模板。多個(gè)這樣的報(bào)表模板存儲(chǔ)在一起,就構(gòu)成了服務(wù)器中的報(bào)表模板,可在其中選擇任何一個(gè)模板來(lái)生成與其格式一樣的報(bào)表。下面具體描述使用者在瀏覽器上選擇具體報(bào)表后,其生成報(bào)表的過(guò)程。圖3示出了上述步驟S2中報(bào)表模板加載的具體步驟,在圖3中,包括步驟S21讀取所選報(bào)表的樣式文件,生成報(bào)表樣式定義對(duì)象在本步驟中,讀取所選報(bào)表的樣式文件,解析該樣式文件中的信息,于是生成報(bào)表樣式定義對(duì)象。步驟S22讀取所選報(bào)表的模板文件,得到其中的單元格信息在本步驟中,讀取所選報(bào)表的模板文件,取得其區(qū)段中每個(gè)單元格或合并單元格的信息,完成模板力口載。圖4示出了上述步驟S3中報(bào)表生成(在上述模板加載完成后)的具體步驟,在圖4中,包括-步驟S30構(gòu)造一個(gè)新報(bào)表,設(shè)置該報(bào)表的輸出途徑由本步驟開(kāi)始,直到步驟S39,都是在描述被選擇的報(bào)表的生成過(guò)程,其中,步驟S31到步驟S32是該報(bào)表的初始化過(guò)程;步驟S33到步驟S35是描述該報(bào)表中生成新區(qū)段的過(guò)程;步驟S36到步驟S39描述的是將要求的數(shù)據(jù)填充新區(qū)段的過(guò)程。在本步驟中,構(gòu)造一個(gè)新的報(bào)表,設(shè)置報(bào)表輸出。報(bào)表可輸出到文件,也可以輸出到瀏覽器。步驟S31由所述報(bào)表模板中復(fù)制表頭和表尾到新報(bào)表中上述報(bào)表中表頭、表尾部分是固定的,都只有一個(gè),但分組頭、明細(xì)、分組尾是按需要生成的。所以初始化報(bào)表時(shí)從報(bào)表模板中復(fù)制表頭和表尾到新報(bào)表。步驟S32將新區(qū)段插入指針設(shè)置在上述表頭和表尾之間在本步驟中,設(shè)置新區(qū)段插入指針在表頭和表尾之間的位置,完成報(bào)表的初始化。步驟S33在所述新區(qū)段位置插入模板文件中的行數(shù)在本步驟中,在新區(qū)段插入指針位置處,插入?yún)^(qū)段定義的行數(shù);這個(gè)區(qū)段定義的行數(shù)也就是模板文件中所定義的行數(shù)。步驟S34以模板文件中的行高設(shè)置所插入行的行高在本步驟中,設(shè)置新區(qū)段中各行的高度為模板中該區(qū)段各行高度。步驟S35復(fù)制模板文件中各單元格信息到所插入的單元格中在本步驟中,將模板中該區(qū)段中各單元格的文字、樣式、表格線、合并單元格信息復(fù)制到新生成的區(qū)段中。步驟S36取得單元格對(duì)應(yīng)的數(shù)據(jù)項(xiàng)定義在本步驟中,由上述報(bào)表定義對(duì)象(讀取報(bào)表樣式文件時(shí)產(chǎn)生的)中獲取分別對(duì)應(yīng)于各個(gè)單元格的數(shù)據(jù)項(xiàng)定義。步驟S37獲取數(shù)據(jù)因上述步驟已得到數(shù)據(jù)項(xiàng)的定義,而其定義中有這些數(shù)據(jù)的所在位置,因此,本步驟中,從提供的數(shù)據(jù)對(duì)象里獲取數(shù)據(jù)。步驟S38處理所述數(shù)據(jù)在上述取得的數(shù)據(jù)中,按照數(shù)據(jù)項(xiàng)定義的數(shù)據(jù)類型、所在單元格位置、;f各式對(duì)數(shù)據(jù)進(jìn)行處理。例如可能有些數(shù)據(jù)需要運(yùn)算等。步驟S39將處理后的數(shù)據(jù)填入對(duì)應(yīng)單元格將上述處理過(guò)的數(shù)據(jù)填充到目標(biāo)單元格中,完成該報(bào)表的生成。在本實(shí)施例中,實(shí)現(xiàn)了基于Excel模板文件的報(bào)表生成方法,將報(bào)表的樣式控制與數(shù)據(jù)處理完全分開(kāi)。每個(gè)報(bào)表有一個(gè)模板文件和一個(gè)樣式文件。ExcelEngine報(bào)表引擎(以下簡(jiǎn)稱報(bào)表引擎,引擎,或ee)讀取報(bào)表模板文件,樣式文件,得到報(bào)表區(qū)段與數(shù)據(jù)項(xiàng)定義。應(yīng)用程序只需提供數(shù)據(jù)給報(bào)表引擎,報(bào)表引擎根據(jù)報(bào)表定義,生成各個(gè)區(qū)段,然后對(duì)數(shù)據(jù)進(jìn)行格式化等處理,填充到報(bào)表相應(yīng)區(qū)段的指定位置,最終生成報(bào)表文件。在改變報(bào)表樣式時(shí)只需改動(dòng)模板文件。如標(biāo)題文字,字體,位置,單元格大小,邊框。在改變數(shù)據(jù)項(xiàng)格式,位置,是否輸出時(shí)只需改變報(bào)表樣式文件,無(wú)需改動(dòng)程序。只有改變報(bào)表某區(qū)段中包含的數(shù)據(jù)項(xiàng)(如原來(lái)的學(xué)生信息報(bào)表中沒(méi)有家長(zhǎng)姓名和聯(lián)系方式,現(xiàn)在需要添加)或數(shù)據(jù)項(xiàng)所屬區(qū)段改變時(shí),才需要修改程序,提供新加的數(shù)據(jù)項(xiàng)。該引擎可用來(lái)生成各種明細(xì)表,分組表,卡片表等。該引擎可向報(bào)表中嵌入圖片,如各種曲線,直方圖,餅圖等。在本實(shí)施例中,每個(gè)報(bào)表都需要一個(gè)模板文件(Excel文件)和一個(gè)樣式文件(XML文件)。制作報(bào)表的過(guò)程為按照需求,用Excel畫(huà)報(bào)表模板。生成一個(gè)Excel格式的模板文件(xls文件)。將模板按以上方式分好各個(gè)區(qū)段,定好每個(gè)區(qū)段中要放置的數(shù)據(jù)項(xiàng)。以及數(shù)據(jù)項(xiàng)的位置,顯示格式等。將這些配置信息記錄在樣式文件中。生成一個(gè)沖羊式文件(xml文件)。在本實(shí)施例中中,一個(gè)才各式文件的例子為普通明細(xì)表-操作員清單—style,xml<xmlversion="l.0"encoding="UTF-8"><reportdefine><report-definename'操作員清單"model_file="普通明細(xì)表—操作員清單.xls"create—date="2008-10-30"title—rows="5"group—title—rows="0"body—rows='T'group—foot—rows='T'footrows="0"print—cols="B匿E"/><report-title-define><itemname—'title'1row="2"col二"b"display="true"fonnat=',0/ol$st喿<乍員清單"format—data—type二"c"length二"0'1datatype="c"/><itemname:"pWntdate1,row="3"col="e"display="true"format二1,1,length="0"datatype="d"/></report-title-define><report-grouptitIe-define></report-grouptitle-defme><report-body-define><itemname:"getBh"<itemname=''getMc"<itemname="getGdj"<itemname—'getJs"</report-body-define〉<report-groupfoot-define></report-groupfoot-define><report-foot-define></report-foot-define><report-imagesegment="foot"row—'i"col="b"height一rows="10"width_cols="5"/><remark></remark></reportdefme>該文件是一個(gè)標(biāo)準(zhǔn)格式的XML文件,其格式符合XML文件格式的要求。以UTF-8作為編碼4各式。以下對(duì)樣式文件的內(nèi)容啦爻一詳細(xì)說(shuō)明在該文件中,才艮節(jié)點(diǎn)的名稱為〈reportdefine〉。在本實(shí)施例中。<reportdefine〉的第一個(gè)子結(jié)點(diǎn)是〈report—define>,該節(jié)點(diǎn)是對(duì)整個(gè)報(bào)表的定義,有以下屬性〈report-defi歸ame="操作員清單"-報(bào)表名稱,如果運(yùn)行時(shí)將報(bào)row="]''col="b"display二"true"format-1'"length="0"datatype="c"/〉row二'M"col:"c'1display="true"format=''''length="0"datatype="c"/>row=tT'col:"d"display="trueMformat="''length="0"datatype="c"/>row='MMcol="e"display="true"forrnat='mlength="0"datatype二"c"/>10表輸出為Exce1文件,Excel文件的默認(rèn)文件名就是凈艮表名稱;model_file="普通明細(xì)表—操作員清單.xls"-使用的模板文件名。模板文件應(yīng)和樣式文件在同一個(gè)目錄里,文件名稱可以不同。但建議起相同的名字以便管理;create—date="2008-10-30"-創(chuàng)建日期。非關(guān)4建屬性;title-rows="5"-表頭行數(shù);group—title—rows="0"-分組頭行數(shù);body—rows=""-表體行數(shù);group-foot—rows="1"-分組尾行數(shù);foot—rows-"Q"-表尾行數(shù);print—cols="B-E"/>-打印列范圍。第一列的列號(hào)-最末列列號(hào)(使用Excel的ABC樣式表示列號(hào)而不要使用—般可指定第一列到最后一個(gè)有數(shù)據(jù)的列,以便報(bào)表引擎處理報(bào)表模板時(shí),忽略右邊那些沒(méi)有內(nèi)容的列,可加快運(yùn)行速度。以上5個(gè)區(qū)段,如果某個(gè)區(qū)段沒(méi)有,則對(duì)應(yīng)區(qū)段行數(shù)=0在本實(shí)施例中,定義了報(bào)表的屬性后,還需要定義各個(gè)區(qū)段的如下數(shù)據(jù)項(xiàng)〈report-title-define〉一表頭區(qū)凄丈才居項(xiàng)定義〈report-grouptitle-define>-分組頭區(qū)數(shù)據(jù)項(xiàng)定義<report-body-define〉-表體區(qū)數(shù)據(jù)項(xiàng)定義<report-g,pfoot-define>-分組尾區(qū)數(shù)據(jù)項(xiàng)定義〈report-foot-define〉-表尾區(qū)凝:據(jù)項(xiàng)定義其中,如某個(gè)區(qū)段中無(wú)數(shù)據(jù)項(xiàng),對(duì)應(yīng)節(jié)點(diǎn)無(wú)子結(jié)點(diǎn)。對(duì)于〈report-grouptitle_define〉,<report-body-define>,<report-groupfoot-define〉節(jié)點(diǎn),可以有以下兩個(gè)屬性addpagebreak,ignorefirst。如<report-body-defineaddpagebreak="true"ignorefirst="true"〉。其中,addpagebreak:耳又4直為',true"/"false",如果省田各,則默認(rèn)為"false"。每次生成一個(gè)新的區(qū)段時(shí),是否在該區(qū)^:前邊添加一個(gè)換頁(yè)符。這種情況對(duì)打印發(fā)票這種固定大小的的報(bào)表特別有用。比如,要打印多個(gè)用戶的費(fèi)用清單,每個(gè)用戶的費(fèi)用清單使用固定大小的打印紙,那么可以把報(bào)表的紙張大小定義為自定義大小,然后在生成每個(gè)用戶的清單時(shí),給前邊添加一個(gè)換頁(yè)符,這樣每次打印完一個(gè)用戶的信息,打印機(jī)都會(huì)強(qiáng)行換頁(yè),保證下一個(gè)用戶信息打印在新的一頁(yè)紙上。此外,ignorefirst:取值為"true"/"false",如果省略,則默認(rèn)為"true"。只有當(dāng)addpagebreak=true時(shí),ignorefirst才起作用。表示第一個(gè)生成的區(qū)段前是否忽略分頁(yè)符。一般而言,對(duì)Excel文件來(lái)說(shuō),填到每個(gè)單元格的數(shù)據(jù)項(xiàng)有三種數(shù)據(jù)類型字符串型,數(shù)字型,日期時(shí)間型。對(duì)字符串來(lái)說(shuō)一般是原樣填充,對(duì)數(shù)字型和曰期時(shí)間型可在Excel模板文件里設(shè)置顯示格式,只有在Excel里不支持的格式化,才需要在程序進(jìn)行格式化處理。Excel表格中還可以設(shè)置各種計(jì)算公式,比如總價(jià)=單價(jià)*數(shù)量,這種情況下,單價(jià)和數(shù)量都要以數(shù)字方式填充到單元格中,Excel才能正確的計(jì)算。在本實(shí)施例中,如果某區(qū)段中有數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng)按以下格式配置<itemnarae="title"row="2"col=''b"display-"true"datatype々"format="%l$s操作員清單"format-data—type="c"length-'10"/〉其中name:數(shù)據(jù)項(xiàng)名稱,string;row:在所在區(qū)段中的相對(duì)行號(hào),行號(hào)從1開(kāi)始。int,取值范圍1-該區(qū)段行數(shù);col:所在列,使用ABC樣式的列號(hào)表示。string,取值范圍A-打印列的最末列列號(hào);display:是否顯示,如果為f'alse,則引擎運(yùn)行時(shí)該數(shù)據(jù)不填充到模板中。Boolean,取值"true"/"false";datatype:數(shù)據(jù)類型,String,可選值為c/n/d。即字符型/數(shù)字型/日期型,如果不能確定數(shù)據(jù)類型的話,可選擇字符型,這樣數(shù)據(jù)會(huì)原樣填到報(bào)表中;如果選擇數(shù)字型或日期型,那么數(shù)據(jù)會(huì)按照數(shù)字或日期方式填到表格中。format:格式化字符串。String。如果不需要對(duì)該數(shù)據(jù)進(jìn)行格式化處理,則format為空(空字符串一"")。如果數(shù)據(jù)類型指定為字符型,format參數(shù)才起作用。format的的格式應(yīng)符合Java中format函數(shù)的語(yǔ)法。具體語(yǔ)法"i青參閱Java相關(guān)文檔。對(duì)于"%l$s操作員清單"這樣的格式字符串的解釋如下%l$s表示第一個(gè)參數(shù)的占位符。比如運(yùn)行時(shí)該數(shù)據(jù)項(xiàng)的值是"南山供電局",那么使用"°/。l$s操作員清單,,對(duì)"南山供電局,,進(jìn)行格式化后的結(jié)果是"南山供電局操作員清單",即運(yùn)行時(shí)使用該數(shù)據(jù)項(xiàng)的值替換格式字符串中的占位符。format—data-type:才各式4匕IU居時(shí)4安4十么方式。String,可選值c/n/d。該屬性只有在數(shù)據(jù)類型為字符型且format屬性不為空時(shí)才需要配置。format—data-type屬性指明對(duì)數(shù)據(jù)進(jìn)行才各式化時(shí),按照哪種數(shù)據(jù)類型進(jìn)行格式化處理。C-字符型,n--數(shù)字型,d--日期型。如果數(shù)據(jù)類型錯(cuò)誤,那么格式化過(guò)程會(huì)出錯(cuò)。length:數(shù)據(jù)填充長(zhǎng)度,int型,取值范圍>=0,以字節(jié)為單位。(注意一個(gè)漢字為兩個(gè)字節(jié))。該屬性只有在數(shù)據(jù)類型為字符型時(shí)起作用。如果length-0,數(shù)據(jù)按實(shí)際長(zhǎng)度填到單元格里。如果〉0,則判斷數(shù)據(jù)長(zhǎng)度是否超出length,如果超出的話會(huì)截?cái)?。在某些?bào)表中,單元格的大小是固定的,只能容納有限個(gè)字符,這種情況下可使用length屬性來(lái)將超出的字符截?cái)?。?duì)于某些圖文并茂的報(bào)表,比如報(bào)表上部是表格,下邊需要輸出一個(gè)chart,這種時(shí)候需要給報(bào)表定義一個(gè)特殊的區(qū)段-圖片段〈report-inmge〉。運(yùn)行時(shí),可將其他程序生成的圖片輸出到如果報(bào)表中〈report-image〉定義的位置。如果不需要圖片,可以沒(méi)有〈report-image〉節(jié)點(diǎn)。<report-imagesegment="foot"row="1"col="b"height—rows="10"width—cols="5"/〉其中segment:圖片所屬區(qū)段,String,可選值title/group一title/body/group—foot/foot;row:圖片在所定義區(qū)段中的位置。行號(hào),int,取值范圍l-所屬區(qū)段的行數(shù);col:圖片在所定義區(qū)段中的位置。列號(hào),String,ABC樣式的列號(hào)。取值范圍A-打印范圍的最末列;height—rows:圖片占的行數(shù),int,耳又值范圍row+height—rows應(yīng)小于所屬區(qū)段的行數(shù);width—cols:圖片占的列凄史,int,耳又值范圍col+width_cols應(yīng)小于打印范圍的最末列;實(shí)際上,圖片輸出到才艮表后,將占據(jù)從第row行上邊沿,第col列左邊沿,height—rows行高,width_cols列寬的一個(gè)范圍。并且在用戶拖動(dòng)改變行高列寬時(shí),圖片的大小也將跟著改變。例如普通報(bào)表,上邊是明細(xì)表格,最后輸出一個(gè)Chart圖片??蓪D片定義在foot區(qū);分組報(bào)表,每個(gè)分組中都需要有自己的Chart圖片,可將圖片定義在group-foot區(qū)。此外,在本實(shí)施例中,〈remark〉〈/remark〉節(jié)點(diǎn)中還可以寫(xiě)一些備注信息。在本實(shí)施例中,上述報(bào)表的實(shí)現(xiàn)過(guò)程如下首先,在ExcelEngine(報(bào)表引擎)軟件包里計(jì)劃實(shí)現(xiàn)以下幾個(gè)類其中,報(bào)表樣式定義部分包括ReportStyleDefine:Bean,報(bào)表樣式定義對(duì)象Segment:Bean,報(bào)表區(qū)段定義;SegType:枚舉,報(bào)表區(qū)段類別;DataItem:Bean,報(bào)表數(shù)據(jù)項(xiàng)定義;ImageDefine:Bean,圖片定義;MergeRange:Bean,合并單元格定義;而報(bào)表處理引擎部分包括ExcelEngine:報(bào)表引擎類上述各個(gè)類的結(jié)構(gòu)描述如下R印ortStyleDefine類的基礎(chǔ)l史據(jù)結(jié)構(gòu)如下表String;:createDate創(chuàng)建日期int;eridCoi結(jié)束列號(hào)ImageDefine|imageDefine報(bào)表中定義的圖片String:modelFileName模板文件名Sheet:modelSheet模板sheet對(duì)象,只讀Workbook:modelWorkBookI模板workbook對(duì)象,只讀Stringlnams報(bào)表的名字HashMap<SegType,Segm:segmentsent〉!報(bào)表中各區(qū)段的定義對(duì)象,:Title,GroupTitle,Body,GroupFoot,F(xiàn)oot.五個(gè)段每;個(gè)都會(huì)在map中放一個(gè)實(shí)例SegType:區(qū)段類別Segment:區(qū)段實(shí)例intistartCol起始列號(hào)(第一列從O開(kāi)始)StringstyleFileName15Segment類的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)如下表ArrayLisKData工tem〉;dataltems該區(qū)段中定義的數(shù)據(jù)項(xiàng)如果區(qū)段的行數(shù)定義為0,那么區(qū)段中不應(yīng)定義數(shù)據(jù)項(xiàng)。boolean:isAddPageBreak生成新的該區(qū)段時(shí),是否在前邊添加一個(gè)1RowPageBreak(行分頁(yè)符)boolean;isIgnoreFirst如果在生成新區(qū)段時(shí)需要在之前添加行;分頁(yè)符,如果該區(qū)段是首次生成,是否不添加行分i頁(yè)符。ArrayList<MergeRange>:mergeRange該區(qū)段中包含的合并單元格的定義注意:報(bào)表定義時(shí),合并單元格不應(yīng)跨區(qū)段。intIrows行數(shù)intstartRow在模板中的起始行數(shù),從Q開(kāi)始SegType區(qū)段類別<table>tableseeoriginaldocumentpage17</column></row><table>在本實(shí)施例中,當(dāng)上述各個(gè)類建立后,開(kāi)始讀取模板文件及樣式文件報(bào)表引擎讀取樣式定義文件,解析報(bào)表定義信息,生成一個(gè)報(bào)表樣式定義對(duì)象ReportStyleDefine;讀取報(bào)表模板文件,將模板文件中的第一頁(yè)當(dāng)作模板。讀取每個(gè)區(qū)段中的合并單元格信息。如果某個(gè)合并單元格跨了不同的區(qū)段,那么解析過(guò)程失敗,拋出異常。至此,加載模板過(guò)程結(jié)束。當(dāng)上述加載模板完成后,開(kāi)始生成報(bào)表,即構(gòu)造一個(gè)新的報(bào)表,設(shè)置報(bào)表輸出??奢敵龅轿募部梢暂敵龅綖g覽器response(在Web應(yīng)用時(shí)比較方便)。初始化報(bào)表對(duì)象。報(bào)表中表頭、表尾部分是固定的,只有一個(gè),但分組頭、明細(xì)、分組尾是按需要生成的。所以初始化報(bào)表時(shí)從報(bào)表模板中復(fù)制表頭和表尾到新報(bào)表。并設(shè)置新區(qū)段插入指針是表頭和表尾之間的位置。之后,開(kāi)始填充各區(qū)段數(shù)據(jù),報(bào)表引擎提供了各種方法接受以下格式的數(shù)據(jù)BEAN,-單個(gè)的JavaBean,實(shí)際就是一個(gè)Java類實(shí)例。通過(guò)訪問(wèn)指定的方法獲得數(shù)據(jù)。MAP,-JavaMap對(duì)象。通過(guò)Key可從Map中獲得凄丈據(jù)。ARRAY,-JavaArray對(duì)象,即數(shù)組。里面的數(shù)據(jù)只能按順序(索引)訪問(wèn)。LIST,-JavaList對(duì)象。同Array類似,里面的數(shù)據(jù)只能按順序(索引)訪問(wèn)。DATASET-雨,-JavaDataSet對(duì)象。即數(shù)據(jù)集對(duì)象對(duì)象,但只使用DataSet中的當(dāng)前記錄。LIST—BEAN,-JavaList〈Bean〉對(duì)象,Bean對(duì)象的集合。LIST—MAP,-JavaLisKMap〉對(duì)象。List中的每個(gè)元素是一個(gè)Map。DATASET,-數(shù)據(jù)集對(duì)象。類似于ResaultSet。其中可包含多條記錄。GROUP—MAP;-JavaMap〈Beanl,Lis<86&112>〉對(duì)象。一般用來(lái)給分組報(bào)表提供數(shù)據(jù)。Beanl用來(lái)提供分組的數(shù)據(jù),1^3^86&112〉用來(lái)給該分組的明細(xì)區(qū)提供數(shù)據(jù)。在上述填充過(guò)程中,生成一個(gè)新的區(qū)段,然后從報(bào)表定義對(duì)象里獲取各個(gè)數(shù)據(jù)項(xiàng)定義,從提供的數(shù)據(jù)對(duì)象里獲取數(shù)據(jù)。再按照數(shù)據(jù)項(xiàng)定義的數(shù)據(jù)類型、所在單元格位置、格式對(duì)數(shù)據(jù)進(jìn)行處理,處理完后填充到目標(biāo)單元格中。其中,生成一個(gè)新的區(qū)段由包括生成新區(qū)段的過(guò)程如果要生成的區(qū)段是表頭、表尾,則忽略生成區(qū)段的過(guò)程。因?yàn)楸眍^表尾已存在了;在新區(qū)段插入指針位置處,插入?yún)^(qū)段定義的行數(shù);設(shè)置新區(qū)段中各行的高度為模板中該區(qū)段各行高度;將模板中該區(qū)段中各單元格的文字、樣式、表格線、合并單元格信息復(fù)制到新生成的區(qū)段中。如果該區(qū)段需要添加換頁(yè)符,則在區(qū)段頂端添加換頁(yè)符。其中,新區(qū)段插入指針=新區(qū)段插入指針+新區(qū)段行數(shù);填充數(shù)據(jù)從該區(qū)4爻定義對(duì)象segment,dataltems中可得知該全段中各個(gè)數(shù)據(jù)項(xiàng)的配置信息。如果提供的數(shù)據(jù)為Bean,那么dataltera.name實(shí)際上對(duì)應(yīng)的是Bean的某個(gè)方法名,利用Java反射機(jī)制,訪問(wèn)、Bean的某個(gè)方法,獲得數(shù)據(jù);如果提供的數(shù)據(jù)為Array或List,那么按dataltem在dataltems中的index,從Array或Ust中獲得數(shù)據(jù);如果提供的數(shù)據(jù)為DaUSet,那么dataltem.name實(shí)際上是字段名,按字段名從DataSet中獲fl數(shù)據(jù);如果提供的數(shù)據(jù)為Map,那么dataltem.name實(shí)際上是Map.key,按key到Map中獲得指定的數(shù)據(jù);在獲得數(shù)據(jù)后,就可以按照dataltem的其他屬性對(duì)數(shù)據(jù)進(jìn)行處理,然后填充。如果dataltem.isFill=false,則不填充該lt據(jù)項(xiàng);按dataltem的數(shù)據(jù)類型對(duì)數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換,轉(zhuǎn)換為字符型/數(shù)字型/日期時(shí)間型,然后按不同類型填充到區(qū)段的對(duì)應(yīng)位置。位置屬性為dataltem.row和dataltem.col。遍歷segment,dataltems中的各個(gè)數(shù)據(jù)項(xiàng),逐個(gè)進(jìn)行填充;如果提供的數(shù)據(jù)為DataSet,List〈Bean〉,List〈Map〉這種包含多個(gè)數(shù)據(jù)對(duì)象的集合,那么就會(huì)逐個(gè)生成多個(gè)區(qū)段。比如明細(xì)區(qū)中的多行記錄。對(duì)于分組報(bào)表,有以下兩種快捷數(shù)據(jù)填充方式調(diào)用fillGroup—And—Body(DataSetgro叩DS,DataSetbodyDS,StringfilterFieldName)方法填充;其中g(shù)roupDS是分組數(shù)據(jù)集對(duì)象;b。dyDS是分組明細(xì)區(qū)數(shù)據(jù)集對(duì)象;fiUerFieldName是分組數(shù)據(jù)對(duì)象和明細(xì)數(shù)據(jù)對(duì)象的關(guān)聯(lián)字段。引擎首先在groupDS中遍歷每條記錄,為每條記錄生成一個(gè)分組頭,19然后按關(guān)聯(lián)字段的值,到bodyDS中搜索符合條件的記錄,然后生成多個(gè)分組明細(xì)記錄。第二種方法調(diào)用fillGroup-And—Body(LinkedHashMap〈Object,ArrayList〈Object》,)方法填充;其中map.keyBean,為分組頭和分組尾提供數(shù)據(jù);mep.valueLisyKBean〉,為該分組的明細(xì)區(qū)才是供數(shù)據(jù)。各區(qū)段數(shù)據(jù)都寫(xiě)入報(bào)表后,將報(bào)表內(nèi)容寫(xiě)入文件,然后關(guān)閉打開(kāi)的文件,釋放資源。至此報(bào)表制作過(guò)程結(jié)束。綜上所述,本發(fā)明解決了在J2EE平臺(tái)下報(bào)表制作時(shí)數(shù)據(jù)和樣式控制完全分離的問(wèn)題,使用Excel文件作為報(bào)表模板的問(wèn)題??稍诟鞣N管理信息系統(tǒng)中生成報(bào)表時(shí)使用。以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。20權(quán)利要求1、一種報(bào)表的生成方法,其特征在于,所述每種報(bào)表包括一個(gè)模板文件和一個(gè)樣式文件,還包括如下步驟A)構(gòu)造與每種報(bào)表模板,得到與該報(bào)表對(duì)應(yīng)的模板文件和樣式文件,并存儲(chǔ);B)選擇報(bào)表種類,并讀取與報(bào)表對(duì)應(yīng)的模板文件和樣式文件,加載報(bào)表模板;C)生成報(bào)表,并輸出。2、根據(jù)權(quán)利要求1所述的報(bào)表的生成方法,其特征在于,所述步驟A)進(jìn)一步包括Al)用Excel得到所需報(bào)表模板樣式,生成Excel格式的模板文件;A2)定義所述報(bào)表模板樣式中的各區(qū)段,生成樣式文件。3、根據(jù)權(quán)利要求2所述的報(bào)表的生成方法,其特征在于,步驟A2)中所述定義各區(qū)段包括定義各區(qū)段中所要放置的數(shù)據(jù)項(xiàng)、所述數(shù)據(jù)項(xiàng)的位置以及所述數(shù)據(jù)項(xiàng)的顯示格式,所述生成樣式文件包括將上述信息記錄在所述樣式文件中。4、根據(jù)權(quán)利要求3所述的報(bào)表的生成方法,其特征在于,所述模板文件包括.x1s文件;所述樣式文件包括.xm1文件。5、根據(jù)權(quán)利要求4所述的報(bào)表的生成方法,其特征在于,所述步驟B)進(jìn)一步包括Bl)讀取所選報(bào)表的樣式文件,解析其定義信息,生成報(bào)表樣式定義對(duì)象;B2)讀取所選報(bào)表的模板文件,讀取其每個(gè)區(qū)段中的合并單元格信息。6、根據(jù)權(quán)利要求5所述的報(bào)表的生成方法,其特征在于,所述步驟C)進(jìn)一步包括如下步驟Cl)構(gòu)造一個(gè)新報(bào)表,設(shè)置該報(bào)表的輸出路徑;C2)初始化所構(gòu)造的新報(bào)表;C3)生成新區(qū)段;C4)填充所述新區(qū)段,并輸出所述新報(bào)表。7、根據(jù)權(quán)利要求6所述的報(bào)表的生成方法,其特征在于,所述步驟C2)進(jìn)一步包括C21)由所述報(bào)表模板中復(fù)制其表頭和表尾到所述新報(bào)表;C22)將新區(qū)段插入指針位置設(shè)置在所述表頭和表位之間。8、根據(jù)權(quán)利要求7所述的報(bào)表的生成方法,其特征在于,所述步驟C3)進(jìn)一步包括如下步驟C31)在所述新區(qū)段插入指針位置插入模板文件中所述區(qū)段定義的行數(shù);C32)用所述模板文件中定義該區(qū)段的行高來(lái)定義所述新區(qū)段的行高;C33)將所述模板文件中該區(qū)段中各單元格的信息復(fù)制到所述新區(qū)段中。9、根據(jù)權(quán)利要求8所述的報(bào)表的生成方法,其特征在于,所述步驟C4)進(jìn)一步包括如下步驟C41)由所述報(bào)表定義對(duì)象中取得所述報(bào)表中各區(qū)段單元格所對(duì)應(yīng)的數(shù)據(jù)項(xiàng)的定義;C42)從指定的數(shù)據(jù)對(duì)象中獲取數(shù)據(jù);C43)處理所述數(shù)據(jù);C44)將所述處理后得到的數(shù)據(jù)填入其對(duì)應(yīng)的區(qū)段單元格中。10、根據(jù)權(quán)利要求9所述的報(bào)表的生成方法,其特征在于,步驟C41)中所述數(shù)據(jù)項(xiàng)定義包括數(shù)據(jù)項(xiàng)名稱、所述數(shù)據(jù)項(xiàng)所在的位置以及所述數(shù)據(jù)項(xiàng)的顯示格式。全文摘要本發(fā)明涉及一種報(bào)表的生成方法,所述每種報(bào)表包括一個(gè)模板文件和一個(gè)樣式文件,還包括如下步驟構(gòu)造與每種報(bào)表模板,得到與該報(bào)表對(duì)應(yīng)的模板文件和樣式文件,并存儲(chǔ);選擇報(bào)表種類,并讀取與報(bào)表對(duì)應(yīng)的模板文件和樣式文件,加載報(bào)表模板;生成報(bào)表,并輸出。實(shí)施本發(fā)明的報(bào)表的生成方法,具有以下有益效果由于每個(gè)報(bào)表都具有與其對(duì)應(yīng)的模板文件和樣式文件,因此在生成報(bào)表時(shí)其表格與表格中的數(shù)據(jù)是分開(kāi)的,所以就絕大多數(shù)情況而言不需要改動(dòng)代碼、使用方便以及操作簡(jiǎn)單。文檔編號(hào)G06F17/24GK101650711SQ20091010935公開(kāi)日2010年2月17日申請(qǐng)日期2009年8月18日優(yōu)先權(quán)日2009年8月18日發(fā)明者鄧志峰申請(qǐng)人:深圳市科陸電子科技股份有限公司