欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種報(bào)表的生成方法

文檔序號:6576514閱讀:245來源:國知局

專利名稱::一種報(bào)表的生成方法
技術(shù)領(lǐng)域
:本發(fā)明涉及電子表格,更具體地說,涉及一種報(bào)表的生成方法。
背景技術(shù)
:電子表格是一種在日常工作中經(jīng)常使用的工具,其使用的方便程度經(jīng)常影響使用者對其所在的運(yùn)用系統(tǒng)的評價(jià)。目前應(yīng)用系統(tǒng)在制作報(bào)表時(shí),一般有這樣幾種方法一種方法是使用POI,JXL等Excel驅(qū)動(dòng)程序,生成Excel報(bào)表對象,然后向指定的單元格寫入數(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)表對象,然后提供數(shù)據(jù)給報(bào)表對象即可生成所需報(bào)表,并且報(bào)表輸出支持各種格式。但這種方式需要專用的報(bào)表設(shè)計(jì)工具,這些報(bào)表設(shè)計(jì)工具操作起來比較復(fù)雜,并且報(bào)表模板的設(shè)計(jì)也不是基于Excel表格方式的。不方便大部分操作人員的使用。
發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問題在于,針對現(xiàn)有技術(shù)的上述需要改動(dòng)代碼、使用不方便或操作較為復(fù)雜的缺陷,提供一種基本不需要改動(dòng)代碼、使用方便以及操作筒單的一種報(bào)表的生成方法。本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是構(gòu)造一種報(bào)表的生成方法,所述每種報(bào)表包括一個(gè)模板文件和一個(gè)樣式文件,還包括如下步驟A)構(gòu)造與每種報(bào)表模板,得到與該報(bào)表對應(yīng)的模板文件和樣式文件,并存儲;B)選擇報(bào)表種類,并讀取與報(bào)表對應(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)表樣式定義對象;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)表定義對象中取得所述報(bào)表中各區(qū)段單元格所對應(yīng)的數(shù)據(jù)項(xiàng)的定義;C42)從指定的數(shù)據(jù)對象中獲取數(shù)據(jù);C43)處理所述數(shù)據(jù);C44)將所述處理后得到的數(shù)據(jù)填入其對應(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)表都具有與其對應(yīng)的模板文件和樣式文件,因此在生成報(bào)表時(shí)其表格與表格中的數(shù)據(jù)是分開的,所以就絕大多數(shù)情況而言不需要改動(dòng)代碼、使用方便以及操作簡單。圖1是本發(fā)明一種報(bào)表的生成方法實(shí)施例的報(bào)表生成流程圖;圖2是所述實(shí)施例的報(bào)表模板生成流程圖;圖3是所述實(shí)施例的報(bào)表模板加載流程圖;圖4是所述實(shí)施例中報(bào)表生成流程圖。具體實(shí)施例方式下面將結(jié)合附圖對本發(fā)明實(shí)施例作進(jìn)一步說明。如圖l所示,在本發(fā)明一種報(bào)表的生成方法實(shí)施例中,從總體上來看,包括了如下步驟步驟S1構(gòu)造報(bào)表模板,得到其對應(yīng)的模板文件和樣式文件,存儲這些文件在本步驟中,構(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)表式樣是分開的,互不相關(guān)的,因此其在絕大多數(shù)情況下不需要改動(dòng)代碼、使用方便以及操作簡單。至于,產(chǎn)生報(bào)表模板的具體步驟,稍后有更詳細(xì)的描述。步驟S2選擇報(bào)表,加載其模板在本步驟中,上述報(bào)表模板已經(jīng)存在,使用者(通常在終端的瀏覽器上)選擇報(bào)表模板中的一個(gè),并由服務(wù)器中加載該報(bào)表模板(報(bào)表模板存儲在服務(wù)器上)。步驟S3生成報(bào)表,并輸出在加載的報(bào)表模板上進(jìn)行數(shù)據(jù)取得及處理,最后將這些處理后的數(shù)據(jù)填入對應(yīng)單元,生成報(bào)表,并輸出該報(bào)表。圖2示出了上述步驟S1中報(bào)表模板生成的具體步驟,在圖2中,包括步驟Sll用Excel得到報(bào)表模板的樣式,生成模板文件在本實(shí)施例中,每個(gè)報(bào)表模板都需要一個(gè)模板文件(Excel文件)和一個(gè)樣式文件(XML文件),在本步驟中,就是使用Excel畫出一個(gè)報(bào)表模式,這就得到一個(gè).xls格式的模板文件。步驟S12定義上述模板的樣式中的區(qū)段,生成樣式文件在本步驟中,將上述模板分好各個(gè)區(qū)段,設(shè)定每個(gè)區(qū)段中要放置的數(shù)據(jù)項(xiàng)。以及數(shù)據(jù)項(xiàng)的位置,顯示格式等。將這些配置信息記錄在文件中。生成一個(gè)樣式文件(xml文件)。通過上述步驟S11和步驟S12,得到一個(gè)完整的、包括了模板文件和樣式文件的報(bào)表模板。多個(gè)這樣的報(bào)表模板存儲在一起,就構(gòu)成了服務(wù)器中的報(bào)表模板,可在其中選擇任何一個(gè)模板來生成與其格式一樣的報(bào)表。下面具體描述使用者在瀏覽器上選擇具體報(bào)表后,其生成報(bào)表的過程。圖3示出了上述步驟S2中報(bào)表模板加載的具體步驟,在圖3中,包括步驟S21讀取所選報(bào)表的樣式文件,生成報(bào)表樣式定義對象在本步驟中,讀取所選報(bào)表的樣式文件,解析該樣式文件中的信息,于是生成報(bào)表樣式定義對象。步驟S22讀取所選報(bào)表的模板文件,得到其中的單元格信息在本步驟中,讀取所選報(bào)表的模板文件,取得其區(qū)段中每個(gè)單元格或合并單元格的信息,完成模板力口載。圖4示出了上述步驟S3中報(bào)表生成(在上述模板加載完成后)的具體步驟,在圖4中,包括-步驟S30構(gòu)造一個(gè)新報(bào)表,設(shè)置該報(bào)表的輸出途徑由本步驟開始,直到步驟S39,都是在描述被選擇的報(bào)表的生成過程,其中,步驟S31到步驟S32是該報(bào)表的初始化過程;步驟S33到步驟S35是描述該報(bào)表中生成新區(qū)段的過程;步驟S36到步驟S39描述的是將要求的數(shù)據(jù)填充新區(qū)段的過程。在本步驟中,構(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取得單元格對應(yīng)的數(shù)據(jù)項(xiàng)定義在本步驟中,由上述報(bào)表定義對象(讀取報(bào)表樣式文件時(shí)產(chǎn)生的)中獲取分別對應(yīng)于各個(gè)單元格的數(shù)據(jù)項(xiàng)定義。步驟S37獲取數(shù)據(jù)因上述步驟已得到數(shù)據(jù)項(xiàng)的定義,而其定義中有這些數(shù)據(jù)的所在位置,因此,本步驟中,從提供的數(shù)據(jù)對象里獲取數(shù)據(jù)。步驟S38處理所述數(shù)據(jù)在上述取得的數(shù)據(jù)中,按照數(shù)據(jù)項(xiàng)定義的數(shù)據(jù)類型、所在單元格位置、;f各式對數(shù)據(jù)進(jìn)行處理。例如可能有些數(shù)據(jù)需要運(yùn)算等。步驟S39將處理后的數(shù)據(jù)填入對應(yīng)單元格將上述處理過的數(shù)據(jù)填充到目標(biāo)單元格中,完成該報(bào)表的生成。在本實(shí)施例中,實(shí)現(xiàn)了基于Excel模板文件的報(bào)表生成方法,將報(bào)表的樣式控制與數(shù)據(jù)處理完全分開。每個(gè)報(bào)表有一個(gè)模板文件和一個(gè)樣式文件。ExcelEngine報(bào)表引擎(以下簡稱報(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ū)段,然后對數(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)表樣式文件,無需改動(dòng)程序。只有改變報(bào)表某區(qū)段中包含的數(shù)據(jù)項(xiàng)(如原來的學(xué)生信息報(bào)表中沒有家長姓名和聯(lián)系方式,現(xiàn)在需要添加)或數(shù)據(jù)項(xiàng)所屬區(qū)段改變時(shí),才需要修改程序,提供新加的數(shù)據(jù)項(xiàng)。該引擎可用來生成各種明細(xì)表,分組表,卡片表等。該引擎可向報(bào)表中嵌入圖片,如各種曲線,直方圖,餅圖等。在本實(shí)施例中,每個(gè)報(bào)表都需要一個(gè)模板文件(Excel文件)和一個(gè)樣式文件(XML文件)。制作報(bào)表的過程為按照需求,用Excel畫報(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各式。以下對樣式文件的內(nèi)容啦爻一詳細(xì)說明在該文件中,才艮節(jié)點(diǎn)的名稱為〈reportdefine〉。在本實(shí)施例中。<reportdefine〉的第一個(gè)子結(jié)點(diǎn)是〈report—define>,該節(jié)點(diǎn)是對整個(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"/>-打印列范圍。第一列的列號-最末列列號(使用Excel的ABC樣式表示列號而不要使用—般可指定第一列到最后一個(gè)有數(shù)據(jù)的列,以便報(bào)表引擎處理報(bào)表模板時(shí),忽略右邊那些沒有內(nèi)容的列,可加快運(yùn)行速度。以上5個(gè)區(qū)段,如果某個(gè)區(qū)段沒有,則對應(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ū)段中無數(shù)據(jù)項(xiàng),對應(yīng)節(jié)點(diǎn)無子結(jié)點(diǎn)。對于〈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è)換頁符。這種情況對打印發(fā)票這種固定大小的的報(bào)表特別有用。比如,要打印多個(gè)用戶的費(fèi)用清單,每個(gè)用戶的費(fèi)用清單使用固定大小的打印紙,那么可以把報(bào)表的紙張大小定義為自定義大小,然后在生成每個(gè)用戶的清單時(shí),給前邊添加一個(gè)換頁符,這樣每次打印完一個(gè)用戶的信息,打印機(jī)都會強(qiáng)行換頁,保證下一個(gè)用戶信息打印在新的一頁紙上。此外,ignorefirst:取值為"true"/"false",如果省略,則默認(rèn)為"true"。只有當(dāng)addpagebreak=true時(shí),ignorefirst才起作用。表示第一個(gè)生成的區(qū)段前是否忽略分頁符。一般而言,對Excel文件來說,填到每個(gè)單元格的數(shù)據(jù)項(xiàng)有三種數(shù)據(jù)類型字符串型,數(shù)字型,日期時(shí)間型。對字符串來說一般是原樣填充,對數(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ū)段中的相對行號,行號從1開始。int,取值范圍1-該區(qū)段行數(shù);col:所在列,使用ABC樣式的列號表示。string,取值范圍A-打印列的最末列列號;display:是否顯示,如果為f'alse,則引擎運(yùn)行時(shí)該數(shù)據(jù)不填充到模板中。Boolean,取值"true"/"false";datatype:數(shù)據(jù)類型,String,可選值為c/n/d。即字符型/數(shù)字型/日期型,如果不能確定數(shù)據(jù)類型的話,可選擇字符型,這樣數(shù)據(jù)會原樣填到報(bào)表中;如果選擇數(shù)字型或日期型,那么數(shù)據(jù)會按照數(shù)字或日期方式填到表格中。format:格式化字符串。String。如果不需要對該數(shù)據(jù)進(jìn)行格式化處理,則format為空(空字符串一"")。如果數(shù)據(jù)類型指定為字符型,format參數(shù)才起作用。format的的格式應(yīng)符合Java中format函數(shù)的語法。具體語法"i青參閱Java相關(guān)文檔。對于"%l$s操作員清單"這樣的格式字符串的解釋如下%l$s表示第一個(gè)參數(shù)的占位符。比如運(yùn)行時(shí)該數(shù)據(jù)項(xiàng)的值是"南山供電局",那么使用"°/。l$s操作員清單,,對"南山供電局,,進(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屬性指明對數(shù)據(jù)進(jìn)行才各式化時(shí),按照哪種數(shù)據(jù)類型進(jìn)行格式化處理。C-字符型,n--數(shù)字型,d--日期型。如果數(shù)據(jù)類型錯(cuò)誤,那么格式化過程會出錯(cuò)。length:數(shù)據(jù)填充長度,int型,取值范圍>=0,以字節(jié)為單位。(注意一個(gè)漢字為兩個(gè)字節(jié))。該屬性只有在數(shù)據(jù)類型為字符型時(shí)起作用。如果length-0,數(shù)據(jù)按實(shí)際長度填到單元格里。如果〉0,則判斷數(shù)據(jù)長度是否超出length,如果超出的話會截?cái)?。在某些?bào)表中,單元格的大小是固定的,只能容納有限個(gè)字符,這種情況下可使用length屬性來將超出的字符截?cái)?。對于某些圖文并茂的報(bào)表,比如報(bào)表上部是表格,下邊需要輸出一個(gè)chart,這種時(shí)候需要給報(bào)表定義一個(gè)特殊的區(qū)段-圖片段〈report-inmge〉。運(yùn)行時(shí),可將其他程序生成的圖片輸出到如果報(bào)表中〈report-image〉定義的位置。如果不需要圖片,可以沒有〈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ū)段中的位置。行號,int,取值范圍l-所屬區(qū)段的行數(shù);col:圖片在所定義區(qū)段中的位置。列號,String,ABC樣式的列號。取值范圍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)中還可以寫一些備注信息。在本實(shí)施例中,上述報(bào)表的實(shí)現(xiàn)過程如下首先,在ExcelEngine(報(bào)表引擎)軟件包里計(jì)劃實(shí)現(xiàn)以下幾個(gè)類其中,報(bào)表樣式定義部分包括ReportStyleDefine:Bean,報(bào)表樣式定義對象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é)束列號ImageDefine|imageDefine報(bào)表中定義的圖片String:modelFileName模板文件名Sheet:modelSheet模板sheet對象,只讀Workbook:modelWorkBookI模板workbook對象,只讀Stringlnams報(bào)表的名字HashMap<SegType,Segm:segmentsent〉!報(bào)表中各區(qū)段的定義對象,:Title,GroupTitle,Body,GroupFoot,F(xiàn)oot.五個(gè)段每;個(gè)都會在map中放一個(gè)實(shí)例SegType:區(qū)段類別Segment:區(qū)段實(shí)例intistartCol起始列號(第一列從O開始)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(行分頁符)boolean;isIgnoreFirst如果在生成新區(qū)段時(shí)需要在之前添加行;分頁符,如果該區(qū)段是首次生成,是否不添加行分i頁符。ArrayList<MergeRange>:mergeRange該區(qū)段中包含的合并單元格的定義注意:報(bào)表定義時(shí),合并單元格不應(yīng)跨區(qū)段。intIrows行數(shù)intstartRow在模板中的起始行數(shù),從Q開始SegType區(qū)段類別<table>tableseeoriginaldocumentpage17</column></row><table>在本實(shí)施例中,當(dāng)上述各個(gè)類建立后,開始讀取模板文件及樣式文件報(bào)表引擎讀取樣式定義文件,解析報(bào)表定義信息,生成一個(gè)報(bào)表樣式定義對象ReportStyleDefine;讀取報(bào)表模板文件,將模板文件中的第一頁當(dāng)作模板。讀取每個(gè)區(qū)段中的合并單元格信息。如果某個(gè)合并單元格跨了不同的區(qū)段,那么解析過程失敗,拋出異常。至此,加載模板過程結(jié)束。當(dāng)上述加載模板完成后,開始生成報(bào)表,即構(gòu)造一個(gè)新的報(bào)表,設(shè)置報(bào)表輸出??奢敵龅轿募?,也可以輸出到瀏覽器response(在Web應(yīng)用時(shí)比較方便)。初始化報(bào)表對象。報(bào)表中表頭、表尾部分是固定的,只有一個(gè),但分組頭、明細(xì)、分組尾是按需要生成的。所以初始化報(bào)表時(shí)從報(bào)表模板中復(fù)制表頭和表尾到新報(bào)表。并設(shè)置新區(qū)段插入指針是表頭和表尾之間的位置。之后,開始填充各區(qū)段數(shù)據(jù),報(bào)表引擎提供了各種方法接受以下格式的數(shù)據(jù)BEAN,-單個(gè)的JavaBean,實(shí)際就是一個(gè)Java類實(shí)例。通過訪問指定的方法獲得數(shù)據(jù)。MAP,-JavaMap對象。通過Key可從Map中獲得凄丈據(jù)。ARRAY,-JavaArray對象,即數(shù)組。里面的數(shù)據(jù)只能按順序(索引)訪問。LIST,-JavaList對象。同Array類似,里面的數(shù)據(jù)只能按順序(索引)訪問。DATASET-雨,-JavaDataSet對象。即數(shù)據(jù)集對象對象,但只使用DataSet中的當(dāng)前記錄。LIST—BEAN,-JavaList〈Bean〉對象,Bean對象的集合。LIST—MAP,-JavaLisKMap〉對象。List中的每個(gè)元素是一個(gè)Map。DATASET,-數(shù)據(jù)集對象。類似于ResaultSet。其中可包含多條記錄。GROUP—MAP;-JavaMap〈Beanl,Lis<86&112>〉對象。一般用來給分組報(bào)表提供數(shù)據(jù)。Beanl用來提供分組的數(shù)據(jù),1^3^86&112〉用來給該分組的明細(xì)區(qū)提供數(shù)據(jù)。在上述填充過程中,生成一個(gè)新的區(qū)段,然后從報(bào)表定義對象里獲取各個(gè)數(shù)據(jù)項(xiàng)定義,從提供的數(shù)據(jù)對象里獲取數(shù)據(jù)。再按照數(shù)據(jù)項(xiàng)定義的數(shù)據(jù)類型、所在單元格位置、格式對數(shù)據(jù)進(jìn)行處理,處理完后填充到目標(biāo)單元格中。其中,生成一個(gè)新的區(qū)段由包括生成新區(qū)段的過程如果要生成的區(qū)段是表頭、表尾,則忽略生成區(qū)段的過程。因?yàn)楸眍^表尾已存在了;在新區(qū)段插入指針位置處,插入?yún)^(qū)段定義的行數(shù);設(shè)置新區(qū)段中各行的高度為模板中該區(qū)段各行高度;將模板中該區(qū)段中各單元格的文字、樣式、表格線、合并單元格信息復(fù)制到新生成的區(qū)段中。如果該區(qū)段需要添加換頁符,則在區(qū)段頂端添加換頁符。其中,新區(qū)段插入指針=新區(qū)段插入指針+新區(qū)段行數(shù);填充數(shù)據(jù)從該區(qū)4爻定義對象segment,dataltems中可得知該全段中各個(gè)數(shù)據(jù)項(xiàng)的配置信息。如果提供的數(shù)據(jù)為Bean,那么dataltera.name實(shí)際上對應(yīng)的是Bean的某個(gè)方法名,利用Java反射機(jī)制,訪問、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的其他屬性對數(shù)據(jù)進(jìn)行處理,然后填充。如果dataltem.isFill=false,則不填充該lt據(jù)項(xiàng);按dataltem的數(shù)據(jù)類型對數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換,轉(zhuǎn)換為字符型/數(shù)字型/日期時(shí)間型,然后按不同類型填充到區(qū)段的對應(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ù)對象的集合,那么就會逐個(gè)生成多個(gè)區(qū)段。比如明細(xì)區(qū)中的多行記錄。對于分組報(bào)表,有以下兩種快捷數(shù)據(jù)填充方式調(diào)用fillGroup—And—Body(DataSetgro叩DS,DataSetbodyDS,StringfilterFieldName)方法填充;其中g(shù)roupDS是分組數(shù)據(jù)集對象;b。dyDS是分組明細(xì)區(qū)數(shù)據(jù)集對象;fiUerFieldName是分組數(shù)據(jù)對象和明細(xì)數(shù)據(jù)對象的關(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ù)都寫入報(bào)表后,將報(bào)表內(nèi)容寫入文件,然后關(guān)閉打開的文件,釋放資源。至此報(bào)表制作過程結(jié)束。綜上所述,本發(fā)明解決了在J2EE平臺下報(bào)表制作時(shí)數(shù)據(jù)和樣式控制完全分離的問題,使用Excel文件作為報(bào)表模板的問題??稍诟鞣N管理信息系統(tǒng)中生成報(bào)表時(shí)使用。以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(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)表對應(yīng)的模板文件和樣式文件,并存儲;B)選擇報(bào)表種類,并讀取與報(bào)表對應(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)表樣式定義對象;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ū)段的行高來定義所述新區(qū)段的行高;C33)將所述模板文件中該區(qū)段中各單元格的信息復(fù)制到所述新區(qū)段中。9、根據(jù)權(quán)利要求8所述的報(bào)表的生成方法,其特征在于,所述步驟C4)進(jìn)一步包括如下步驟C41)由所述報(bào)表定義對象中取得所述報(bào)表中各區(qū)段單元格所對應(yīng)的數(shù)據(jù)項(xiàng)的定義;C42)從指定的數(shù)據(jù)對象中獲取數(shù)據(jù);C43)處理所述數(shù)據(jù);C44)將所述處理后得到的數(shù)據(jù)填入其對應(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)表對應(yīng)的模板文件和樣式文件,并存儲;選擇報(bào)表種類,并讀取與報(bào)表對應(yīng)的模板文件和樣式文件,加載報(bào)表模板;生成報(bào)表,并輸出。實(shí)施本發(fā)明的報(bào)表的生成方法,具有以下有益效果由于每個(gè)報(bào)表都具有與其對應(yīng)的模板文件和樣式文件,因此在生成報(bào)表時(shí)其表格與表格中的數(shù)據(jù)是分開的,所以就絕大多數(shù)情況而言不需要改動(dòng)代碼、使用方便以及操作簡單。文檔編號G06F17/24GK101650711SQ20091010935公開日2010年2月17日申請日期2009年8月18日優(yōu)先權(quán)日2009年8月18日發(fā)明者鄧志峰申請人:深圳市科陸電子科技股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
衡水市| 兰州市| 连云港市| 浠水县| 昌宁县| 松桃| 阳曲县| 大化| 万全县| 大洼县| 五华县| 泉州市| 临朐县| 丽水市| 怀集县| 南靖县| 明溪县| 子洲县| 乐平市| 靖江市| 舒兰市| 永胜县| 峡江县| 吉水县| 剑川县| 洪江市| 河源市| 新民市| 连州市| 贞丰县| 昌宁县| 安溪县| 信丰县| 开鲁县| 榕江县| 格尔木市| 封丘县| 湄潭县| 深州市| 仁化县| 达拉特旗|