專利名稱:一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,特別是涉及一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法及裝置。
背景技術(shù):
在當(dāng)今這個以計算機作為最重要信息載體的時代,常常需要將批量數(shù)據(jù)導(dǎo)出成Microsoft Office Excel文件。目前,基于Java的主流開源導(dǎo)出組件有JavaExcelAPI (JXL)和 Ρ0Ι。JXL是一個成熟開源的Excel電子表格讀取、修改、寫入的項目。目前支持的最高版本是 Excel2003,它是基于 BIFF (Binary Interchange File Format, 二進制交換文件格式)格式的。此時,要生成一個Excel文件,必須事先知道Excel文件的大小及各工作表 (sheet)、單元格的偏移量等信息。因此,它在生成Excel文件時,JXL采取先將所有的數(shù)據(jù)放入內(nèi)存中,等到程序關(guān)閉時,再計算Excel文件的大小,并生成Excel文件的所有信息,再一次寫入到磁盤,形成Excel文件。這種方法當(dāng)然簡化了計算,但它需要對每一個單元格都生成相應(yīng)對象,當(dāng)有大批量數(shù)據(jù)時,會造成內(nèi)存溢出。并且,打開一個Excel文件,它同樣會將單元格讀出生成對象,因此它也無法通過分批次導(dǎo)入數(shù)據(jù)來減小內(nèi)存消耗。Jakarta POI是apache的子項目,它提供了一組操縱Windows文檔的JavaAPI。對 Excel,目前提供 HSSF 和 XSSF 接口。HSSF (Horrible SpreadSheetFormat)生成后綴為xls(Excel997-2003)的文件,文件格式同樣為 BIFF 8。XSSF (XML Spreadsheet Format)生成后綴為 xlsx(Excel2007)的文件,它讀寫 Off ice Open XML (00XML,基于 XML-extensibleMarkup Language語言的數(shù)據(jù)儲存語言為Microsoft Off ice開發(fā)所制定的技術(shù)規(guī)范)格式文件。OfficeOpen XML是由微軟公司為Off ice 2007產(chǎn)品開發(fā)的技術(shù)規(guī)范,是XML技術(shù)和ZIP技術(shù)的結(jié)合,現(xiàn)已成為國際文檔格式標(biāo)準(zhǔn)。開發(fā)時,首先生成xml文件集(稱為組件),再將文件打包成zip格式,最后重命名為xlsx后綴,就生成了我們常見的Excel2007文件了。雖然POI提供了讀寫00XML的接口,但在導(dǎo)出時,仍然將全部單元格cell對象存儲于內(nèi)存,大數(shù)據(jù)量時,仍然會造成內(nèi)存溢出。為了實現(xiàn)大批量低內(nèi)存的導(dǎo)出成Excel文件,現(xiàn)有技術(shù)中,專利申請?zhí)枮镃N200810057915.0的中國專利公開了一種將數(shù)據(jù)庫中數(shù)據(jù)導(dǎo)出成Excel文件的裝置及其方法,但該現(xiàn)有技術(shù)存在以下缺陷一、采用先生成數(shù)據(jù)主體文件,再重新修改BIFF (BinaryInterchange File Format)格式的方法,內(nèi)存計算難度大,只要算錯一位,可能導(dǎo)致生成的文件無法打開;二、同樣是由于直接修改內(nèi)存難度大、風(fēng)險高的原因,進一步開發(fā)難度較大,很難進一步的支持樣式設(shè)置等Excel其它常用功能;三、使用場景非常局限,只能針對像數(shù)據(jù)庫這種格式規(guī)整、能計算或預(yù)知行列數(shù)的情況。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法及裝置,用以解決現(xiàn)有技術(shù)中將數(shù)據(jù)導(dǎo)出為Excel文件時內(nèi)存消耗大的問題。為解決上述技術(shù)問題,一方面,本發(fā)明提供一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法,所述方法包括以下步驟建立Excel的組件包目錄結(jié)構(gòu);在所述組件包目錄結(jié)構(gòu)下,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件;生成所述工作表單元格文件的共享字符串文件和配置文件;對生成的上述各文件進行壓縮,然后生成Excel格式的文件。進一步,工作表單元格文件是指Excel文件中的.xml文件。 進一步,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件,具體包括以下步驟對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的頭部描述區(qū),并為無法填寫的參數(shù)預(yù)留空白區(qū)域;對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的數(shù)據(jù)區(qū);對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的尾部公共區(qū);采用隨機訪問磁盤的方式,重新填寫所述頭部描述區(qū)中沒有填寫的參數(shù)。進一步,當(dāng)寫入的數(shù)據(jù)為數(shù)字?jǐn)?shù)據(jù)時,將該數(shù)字?jǐn)?shù)據(jù)寫入工作表單元格文件對應(yīng)的單元格中。進一步,當(dāng)寫入的數(shù)據(jù)為字符串?dāng)?shù)據(jù)時,在工作表單元格文件中指明該字符串?dāng)?shù)據(jù)在共享字符串文件中保存的序號,并將該字符串?dāng)?shù)據(jù)寫入共享字符串文件中。進一步,生成共享字符串文件,具體包括以下步驟當(dāng)有需要寫入的字符串?dāng)?shù)據(jù)時,將該字符串?dāng)?shù)據(jù)在內(nèi)存中進行保存;當(dāng)內(nèi)存中保存的字符串?dāng)?shù)據(jù)的個數(shù)達到預(yù)先設(shè)定的最大值時,將內(nèi)存中的字符串?dāng)?shù)據(jù)寫入磁盤,生成共享字符串文件,并清空所述內(nèi)存。另一方面,本發(fā)明還提供一種將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,所述裝置包括組件包目錄結(jié)構(gòu)建立單元,用于建立Excel的組件包目錄結(jié)構(gòu);工作表單元格文件生成單元,用于在所述組件包目錄結(jié)構(gòu)下,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件;剩余文件生成單元,用于生成所述工作表單元格文件的共享字符串文件和配置文件;Excel文件生成單元,用于對生成的上述各文件進行壓縮,然后生成Excel格式的文件。進一步,工作表單元格文件是指Excel文件中的.xml文件。進一步,所述工作表單元格文件生成單元進一步包括頭部描述區(qū)生成子單元,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的頭部描述區(qū),并為無法填寫的參數(shù)預(yù)留空白區(qū)域;數(shù)據(jù)區(qū)生成子單元,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的數(shù)據(jù)區(qū);尾部公共區(qū)生成子單元,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的尾部公共區(qū);參數(shù)重填子單元,用于采用隨機訪問磁盤的方式,重新填寫所述頭部描述區(qū)中沒有填寫的參數(shù)。進一步,所述裝置還包括 數(shù)字?jǐn)?shù)據(jù)寫入單元,用于當(dāng)寫入的數(shù)據(jù)為數(shù)字?jǐn)?shù)據(jù)時,將該數(shù)字?jǐn)?shù)據(jù)寫入工作表單元格文件對應(yīng)的單元格中。進一步,所述裝置還包括 字符串?dāng)?shù)據(jù)寫入單元,用于當(dāng)寫入的數(shù)據(jù)為字符串?dāng)?shù)據(jù)時,在工作表單元格文件中指明該字符串?dāng)?shù)據(jù)在共享字符串文件中保存的序號,將該字符串?dāng)?shù)據(jù)寫入共享字符串文件中。進一步,所述剩余文件生成單元進一步包括字符串?dāng)?shù)據(jù)保存子單元,用于當(dāng)有需要寫入的字符串?dāng)?shù)據(jù)時,將該字符串?dāng)?shù)據(jù)在內(nèi)存中進行保存;共享字符串文件生成子單元,用于當(dāng)內(nèi)存中保存的字符串?dāng)?shù)據(jù)的個數(shù)達到預(yù)先設(shè)定的最大值時,將內(nèi)存中的字符串?dāng)?shù)據(jù)寫入磁盤,生成共享字符串文件,并清空所述內(nèi)存。本發(fā)明有益效果如下本發(fā)明通過采用邊讀取邊轉(zhuǎn)換方式將數(shù)據(jù)導(dǎo)出成Excel文件,無需將大量對象保存在內(nèi)存內(nèi),且內(nèi)存不會隨保存數(shù)據(jù)的增加而增加,極大的減少了對內(nèi)存的占用。
圖I是本發(fā)明實施例中一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法的流程圖;圖2是本發(fā)明實施例中一種生成工作表單元格文件的流程圖;圖3是本發(fā)明實施例中一種生成共享字符串文件的流程圖;圖4是本發(fā)明實施例中又一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法的流程圖;圖5是本發(fā)明實施例中一種將數(shù)據(jù)導(dǎo)出為Excel文件的裝置的結(jié)構(gòu)示意圖;圖6是本發(fā)明實施例中又一種將數(shù)據(jù)導(dǎo)出為Excel文件的裝置的結(jié)構(gòu)示意圖。
具體實施例方式為了解決現(xiàn)有技術(shù)中將數(shù)據(jù)導(dǎo)出為Excel文件時內(nèi)存消耗大的問題,本發(fā)明提供了一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法及裝置,以下結(jié)合附圖以及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不限定本發(fā)明。如圖I所示,本發(fā)明實施例涉及一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法,該方法采用基于OOXML格式的方式,先在臨時目錄生成Excel的xml組件,具體為原本占用內(nèi)存最大的工作表單元格文件sheet, xml文件采用流式(邊讀取邊轉(zhuǎn)換的方式)輸出,共享字符串文件sharedStrings. xml采用緩存與流式相結(jié)合的方式生成,最后生成配置文件。xml組件生成完成后,再壓縮成zip格式到指定生成文件的目錄,最后更名為以xlsx”結(jié)尾的Excel文件。下面詳細描述該方法,具體包括以下步驟
步驟S101,建立Excel的組件包目錄結(jié)構(gòu);本步驟中,當(dāng)有數(shù)據(jù)需要導(dǎo)出成Excel文件時,用戶通過調(diào)用軟件接口指定需要保存的文件內(nèi)容、文件存放路徑、文件名;然后在磁盤上創(chuàng)建臨時目錄,在臨時目錄中建立Excel的組件包目錄結(jié)構(gòu)。組件包目錄結(jié)構(gòu)為生成MicrosoftOffice Excel文件所必須的目錄,例如rels, docProps, xl 以及 xl 下的 rels、worksheets 目錄等。步驟S102,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件,寫入臨時目錄中;由于生成Excel文件的xml組件中,工作表單元格文件(sheet, xml文件)占用內(nèi)存最大,因此,對該文件采用邊讀取邊轉(zhuǎn)換的方式(流式)寫到磁盤中,可以大大降低內(nèi)存的使用。本實施例中,工作表單元格文件是指Excel文件中的sheet, xml文件。需要說明的
是,通常情況下,一般都是默認(rèn)以sheetl、sheet2、......的方式對工作表進行命名,但是,
不排除因為某些原因采用其它命名方式對工作表進行命名,因此,在采用其它命名規(guī)則對工作表進行命名時,該文件可以等同于sheet, xml文件。
·
步驟S103,生成工作表單元格文件的共享字符串文件和配置文件,寫入臨時目錄中;本實施例中,共享字符串文件,是指Excel文件中的sharedStrings. xml文件。配置文件,是指生成Excel文件的xml組件中,除sheet, xml和sharedStrings. xml文件之外的其它文件,例如,styles文件和其它必要的部署文件。步驟S104,對生成的上述各文件進行壓縮存,然后生成Excel格式的文件。即將寫入臨時目錄中的xml組件壓縮成一個zip格式文件,以用戶指定的文件名和存放目錄進行保存。然后,將zip格式文件重命名成以xlsx”結(jié)尾的用戶指定的文件名,即將數(shù)據(jù)導(dǎo)出為Excel文件。上述實施例中,生成工作表單元格文件的流程圖如圖2所示,包括以下步驟步驟S201,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的頭部描述區(qū),并為無法填寫的參數(shù)預(yù)留空白區(qū)域;即流式生成sheetl. xml文件的worksheet的描述區(qū),并且預(yù)留足夠的空白區(qū)域以供最后修改、擴展。由于頭部描述區(qū)需要填寫一些整個文件的參數(shù),例如整個文件包括多少行、多少列;而這些參數(shù)在采用邊讀取邊轉(zhuǎn)換的方式進行寫入時,是無法獲取的,因此,需要預(yù)留足夠的空白區(qū)域,以便在整個文件寫完之后再重新填與相關(guān)參數(shù)。步驟S202,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的數(shù)據(jù)區(qū);即流式生成sheetl. xml文件的sheetData區(qū),并在內(nèi)存中按順序保存sharedStrings信息和styles信息。步驟S203,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的尾部公共區(qū);即流式完成sheetl. xml文件的尾部公共區(qū)部分,并關(guān)閉對文件sheetl. xml的寫操作。步驟S204,采用隨機訪問磁盤的方式,重新填寫所述頭部描述區(qū)中沒有填寫的參數(shù)。例如重新填寫sheetData的span值。上述步驟在中,雖然宏觀看是流式寫文件,但是完全流式的話,10操作過多,會降低處理速度,因此在具體實施過程中,可以加入緩存,已獲得更佳效果。上述實施例中,生成共享字符串文件的流程圖如圖3所示,包括以下步驟步驟S301,開始;
步驟S302,判斷是否有字符串sharedStrings需要寫入sharedStrings. xml文件中,如果是,則轉(zhuǎn)步驟S303,如果否,則轉(zhuǎn)步驟S307 ;步驟S303,在內(nèi)存中保存該字符串,即保存SharedStrings ;步驟S304,判斷內(nèi)存中需要寫入的字符串個數(shù)是否達到預(yù)先設(shè)定的最大值,如果是,則轉(zhuǎn)步驟S305,如果否,則轉(zhuǎn)步驟S307 ;其中,預(yù)先設(shè)定的內(nèi)存保存字符串個數(shù)的最大值可以根據(jù)經(jīng)驗數(shù)據(jù)設(shè)置,也可以先估計設(shè)置,然后經(jīng)過不斷的調(diào)整,以達到一個合理的數(shù)值。“內(nèi)存保存字符串個數(shù)的最大值”限制是為了保證當(dāng)導(dǎo)出大量數(shù)據(jù)的時候,內(nèi)存不會隨數(shù)據(jù)量的增加而增加到超過允許范圍,避免內(nèi)存溢出。值的設(shè)定可根據(jù)系統(tǒng)允許此導(dǎo)出組件使用的最大內(nèi)存進行調(diào)整,極限情況也可以沒有限制,即字符串全部保存在內(nèi)存中。步驟S305,將內(nèi)存中所有的字符串SharedStrings寫入到磁盤的臨時目錄中的sharedStrings. xml 文件中; 步驟S306,清空內(nèi)存,步驟S307,判斷是否還有數(shù)據(jù)(字符串?dāng)?shù)據(jù))需要寫入,如果是,則轉(zhuǎn)步驟S302,重復(fù)上述步驟;如果否,則轉(zhuǎn)步驟S308 ;步驟S308,結(jié)束。在對Sheet, xml文件流式處理后,再加上帶緩存與流式相結(jié)合生成sharedStrings. xml,可進一步控制內(nèi)存使用,將內(nèi)存使用嚴(yán)格控制在有限的范圍內(nèi)。如圖4所示,下面以一個具體的實例詳細描述將數(shù)據(jù)導(dǎo)出為Excel文件的方法,具體步驟如下步驟S401,當(dāng)有數(shù)據(jù)需要導(dǎo)出成Excel文件時,用戶通過調(diào)用軟件接口指定需要保存的文件內(nèi)容、文件存放路徑、文件名;然后在磁盤上創(chuàng)建臨時目錄,在臨時目錄中建立Excel的組件包目錄結(jié)構(gòu)。組件包目錄包括_rels, docProps, xl以及xl下的_rels、worksheets 目錄等。步驟S402,創(chuàng)建記錄sheet數(shù)據(jù)的文件sheet. xml ;這里面詳細記錄了 sheet信息,包括當(dāng)前選中的單元格,數(shù)據(jù)所覆蓋的跨度區(qū)域,每一個單元格的數(shù)據(jù)類型,數(shù)字或引用的字符串id,以及合并單元格等等。步驟S403,整個組件包中,sheet, xml文件占用空間最大,本發(fā)明的重點就是要實現(xiàn)邊讀取邊轉(zhuǎn)換的方式寫sheet, xml文件,從而達到優(yōu)化內(nèi)存使用的目的。首先寫sheet.xml的worksheet頭部描述區(qū)到磁盤(臨時目錄),包括dimension (描述數(shù)據(jù)所覆蓋的跨度區(qū)域),由于采用邊讀取邊轉(zhuǎn)換的方式順序的寫文件,在需要寫入的最大行、列數(shù)未知的情況下,這些參數(shù)無法預(yù)知,因此需要預(yù)留足夠的空白區(qū)域,以便單元格寫完后再來修改頭部描述區(qū)。步驟S404,針對具體需要寫入的數(shù)據(jù)進行處理,00XML格式的Excel對數(shù)字和字符串的處理方式并不相同,需要區(qū)分。當(dāng)數(shù)據(jù)為數(shù)字時,只需直接將數(shù)據(jù)寫入sheet, xml對應(yīng)的單元格中即可;但是對于字符串(非數(shù)字),它是將數(shù)據(jù)寫入sharedStrings. xml中的,多個單元格、甚至是多個sheet之間可以共享字符串,sheet, xml中只需指明字符串在sharedStrings. xml中保存的位置序號即可。由于sharedStrings需要查找、共享,所以它實際上還是先保持在內(nèi)存中的。因此,本步驟中,判斷寫入的數(shù)據(jù)是否為數(shù)字,如果是,則轉(zhuǎn)步驟S405,如果否,則轉(zhuǎn)步驟S406。步驟S405,當(dāng)步驟S404中數(shù)據(jù)為數(shù)字時,只需直接將數(shù)據(jù)寫入sheet, xml對應(yīng)的單元格中即可;此時只需直接在sheet, xml的sheetData區(qū)中增加row標(biāo)簽和c(cell)子標(biāo)簽即可,并將數(shù)字寫到c標(biāo)簽的子標(biāo)簽V (value)中。步驟S406,判斷S404中數(shù)據(jù)不是數(shù)字時,即該數(shù)據(jù)為字符串?dāng)?shù)據(jù)時,需要進一步判斷保存字符串的sharedStrings內(nèi)存中是否已有該字符串,如果是,則轉(zhuǎn)步驟S408 ;如果否,則轉(zhuǎn)步驟S407。步驟S407,如果sharedStrings內(nèi)存中還沒有該數(shù)據(jù),則將數(shù)據(jù)增加進去。步驟S408,查找字符串在sharedStrings中的位置序號。步驟S409,將字符串的位置序號寫到sheet, xml的sheetData區(qū),即在sheet. xml的sheetData區(qū)中增加row標(biāo)簽和c (cell)子標(biāo)簽,設(shè)置單元格為字符串類型t="s",并將字符串的位置序號寫到c標(biāo)簽的子標(biāo)簽lvalue)中。步驟S410,判斷是否還有需要導(dǎo)出的數(shù)據(jù),如果有,則轉(zhuǎn)步驟S404 ;如果否,則轉(zhuǎn)步驟S411。步驟S411,單元格數(shù)據(jù)已寫完,對sheet, xml的worksheet尾部公共區(qū)設(shè)置進行處理,即將頁面設(shè)置等信息寫到磁盤的sheet, xml文件中。步驟S412,在步驟S403中已預(yù)留了空白區(qū)域,現(xiàn)在以隨機訪問磁盤的方式重寫sheet, xml的worksheet頭部描述區(qū),以填寫正確的dimension(描述數(shù)據(jù)所覆蓋的跨度區(qū)域)信息。步驟S413,判斷是否需要導(dǎo)出下一個sheet,如果是,則轉(zhuǎn)步驟S402,重復(fù)上述步驟,如果否,則轉(zhuǎn)步驟S414。步驟S414,將內(nèi)存中的字符串sharedStrings寫入到文件sharedStrings. xml。步驟S415,生成關(guān)系文件等配置文件;例如,styles文件和其他必要的部署文件。步驟S416,將寫入臨時目錄中的xml組件壓縮成一個zip格式文件,保存在用戶指定的目錄。然后,將zip格式文件重命名成以xlsx”結(jié)尾的用戶指定的文件名,即將數(shù)據(jù)導(dǎo)出為Excel文件?;?0XML格式的流式導(dǎo)出組件尤其適合大批量導(dǎo)出Excel數(shù)據(jù),而且執(zhí)行效率高、內(nèi)存消耗低。如圖5所示,本發(fā)明還涉及一種實現(xiàn)上述實施例方法的將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,包括組件包目錄結(jié)構(gòu)建立單元501,用于建立Excel的組件包目錄結(jié)構(gòu);工作表單元格文件生成單元502,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件;剩余文件生成單元503,用于生成所述工作表單元格文件的共享字符串文件和配置文件;Excel文件生成單元504,用于對生成的上述各文件進行壓縮存,然后生成Excel格式的文件。為達更加效果,如圖6所示,本發(fā)明還涉及一種將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,包括組件包目錄結(jié)構(gòu)建立單元601、工作表單元格文件生成單元602、剩余文件生成單元603、Excel文件生成單元604、數(shù)字?jǐn)?shù)據(jù)寫入單元605和字符串?dāng)?shù)據(jù)寫入單元606。其中,本實施例中的組件包目錄結(jié)構(gòu)建立單元601和Excel文件生成單元604與上一實施例的組件包目錄結(jié)構(gòu)建立單元501和Excel文件生成單元504在結(jié)構(gòu)和功能上相同,因此,本實施例不再詳細描述。其中,工作表單元格文件生成單元602進一步包括頭部描述區(qū)生成子單元6021,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的頭部描述區(qū),并為無法填寫的參數(shù)預(yù)留空白區(qū)域;數(shù)據(jù)區(qū)生成子單元6022,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的數(shù)據(jù)區(qū);尾部公共區(qū)生成子單元6023,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的尾部公共區(qū);參數(shù)重填子單元6024,用于采用隨機訪問磁盤的方式,重新填寫所述頭部描述區(qū)中沒有填寫的參數(shù)。
其中,剩余文件生成單元603進一步包括字符串?dāng)?shù)據(jù)保存子單元6031,用于當(dāng)有需要寫入的字符串?dāng)?shù)據(jù)時,將該字符串?dāng)?shù) 據(jù)在內(nèi)存中進行保存;共享字符串文件生成子單元6032,用于當(dāng)內(nèi)存中保存的字符串?dāng)?shù)據(jù)的個數(shù)達到預(yù)先設(shè)定的最大值時,將內(nèi)存中的字符串?dāng)?shù)據(jù)寫入磁盤,生成共享字符串文件,并清空所述內(nèi)存。其中,數(shù)字?jǐn)?shù)據(jù)寫入單元605,用于當(dāng)寫入的數(shù)據(jù)為數(shù)字?jǐn)?shù)據(jù)時,將該數(shù)字?jǐn)?shù)據(jù)寫入工作表單元格文件對應(yīng)的單元格中。其中,字符串?dāng)?shù)據(jù)寫入單元606,用于當(dāng)寫入的數(shù)據(jù)為字符串?dāng)?shù)據(jù)時,在工作表單元格文件中指明該字符串?dāng)?shù)據(jù)在共享字符串文件中保存的序號,將該字符串?dāng)?shù)據(jù)寫入共享字符串文件中。由上述實施例可以看出,本發(fā)明通過采用邊讀取邊轉(zhuǎn)換方式將數(shù)據(jù)導(dǎo)出成Excel文件,無需將大量對象保存在內(nèi)存,且內(nèi)存不會隨保存數(shù)據(jù)的增加而增加,極大的減少了內(nèi)存的使用。另外,在本發(fā)明所涉及的數(shù)據(jù)源可以是報表,也可以是數(shù)據(jù)庫,使用場景不受限制;通過解析文本,進行相關(guān)設(shè)置和開發(fā),可以進一步支持Excel其它常用功能。盡管為示例目的,已經(jīng)公開了本發(fā)明的優(yōu)選實施例,本領(lǐng)域的技術(shù)人員將意識到各種改進、增加和取代也是可能的,因此,本發(fā)明的范圍應(yīng)當(dāng)不限于上述實施例。
權(quán)利要求
1.一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法,其特征在于,所述方法包括以下步驟 建立Excel的組件包目錄結(jié)構(gòu); 在所述組件包目錄結(jié)構(gòu)下,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件; 生成所述工作表單元格文件的共享字符串文件和配置文件; 對生成的上述各文件進行壓縮,然后生成Excel格式的文件。
2.如權(quán)利要求I所述的將數(shù)據(jù)導(dǎo)出為Excel文件的方法,其特征在于,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件,具體包括以下步驟 對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的頭部描述區(qū),并為無法填寫的參數(shù)預(yù)留空白區(qū)域; 對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的數(shù)據(jù)區(qū); 對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的尾部公共區(qū); 采用隨機訪問磁盤的方式,重新填寫所述頭部描述區(qū)中沒有填寫的參數(shù)。
3.如權(quán)利要求I或2所述的將數(shù)據(jù)導(dǎo)出為Excel文件的方法,其特征在于,當(dāng)寫入的數(shù)據(jù)為數(shù)字?jǐn)?shù)據(jù)時,將該數(shù)字?jǐn)?shù)據(jù)寫入工作表單元格文件對應(yīng)的單元格中。
4.如權(quán)利要求I或2所述的將數(shù)據(jù)導(dǎo)出為Excel文件的方法,其特征在于,當(dāng)寫入的數(shù)據(jù)為字符串?dāng)?shù)據(jù)時,在工作表單元格文件中指明該字符串?dāng)?shù)據(jù)在共享字符串文件中保存的序號,并將該字符串?dāng)?shù)據(jù)寫入共享字符串文件中。
5.如權(quán)利要求I所述的將數(shù)據(jù)導(dǎo)出為Excel文件的方法,其特征在于,生成共享字符串文件,具體包括以下步驟 當(dāng)有需要寫入的字符串?dāng)?shù)據(jù)時,將該字符串?dāng)?shù)據(jù)在內(nèi)存中進行保存; 當(dāng)內(nèi)存中保存的字符串?dāng)?shù)據(jù)的個數(shù)達到預(yù)先設(shè)定的最大值時,將內(nèi)存中的字符串?dāng)?shù)據(jù)寫入磁盤,生成共享字符串文件,并清空所述內(nèi)存。
6.一種將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,其特征在于,所述裝置包括 組件包目錄結(jié)構(gòu)建立單元,用于建立Excel的組件包目錄結(jié)構(gòu); 工作表單元格文件生成單元,用于在所述組件包目錄結(jié)構(gòu)下,對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件; 剩余文件生成單元,用于生成所述工作表單元格文件的共享字符串文件和配置文件; Excel文件生成單元,用于對生成的上述各文件進行壓縮,然后生成Excel格式的文件。
7.如權(quán)利要求6所述的將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,其特征在于,所述工作表單元格文件生成單元進一步包括 頭部描述區(qū)生成子單元,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的頭部描述區(qū),并為無法填寫的參數(shù)預(yù)留空白區(qū)域; 數(shù)據(jù)區(qū)生成子單元,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的數(shù)據(jù)區(qū); 尾部公共區(qū)生成子單元,用于對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件的尾部公共區(qū); 參數(shù)重填子單元,用于采用隨機訪問磁盤的方式,重新填寫所述頭部描述區(qū)中沒有填寫的參數(shù)。
8.如權(quán)利要求6或7所述的將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,其特征在于,所述裝置還包括 數(shù)字?jǐn)?shù)據(jù)寫入單元,用于當(dāng)寫入的數(shù)據(jù)為數(shù)字?jǐn)?shù)據(jù)時,將該數(shù)字?jǐn)?shù)據(jù)寫入工作表單元格文件對應(yīng)的單元格中。
9.如權(quán)利要求6或7所述的將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,其特征在于,所述裝置還包括 字符串?dāng)?shù)據(jù)寫入單元,用于當(dāng)寫入的數(shù)據(jù)為字符串?dāng)?shù)據(jù)時,在工作表單元格文件中指明該字符串?dāng)?shù)據(jù)在共享字符串文件中保存的序號,將該字符串?dāng)?shù)據(jù)寫入共享字符串文件中。
10.如權(quán)利要求6所述的將數(shù)據(jù)導(dǎo)出為Excel文件的裝置,其特征在于,所述剩余文件生成單元進一步包括 字符串?dāng)?shù)據(jù)保存子單元,用于當(dāng)有需要寫入的字符串?dāng)?shù)據(jù)時,將該字符串?dāng)?shù)據(jù)在內(nèi)存中進行保存; 共享字符串文件生成子單元,用于當(dāng)內(nèi)存中保存的字符串?dāng)?shù)據(jù)的個數(shù)達到預(yù)先設(shè)定的最大值時,將內(nèi)存中的字符串?dāng)?shù)據(jù)寫入磁盤,生成共享字符串文件,并清空所述內(nèi)存。
全文摘要
本發(fā)明公開了一種將數(shù)據(jù)導(dǎo)出為Excel文件的方法及裝置,所述方法包括以下步驟建立Excel的組件包目錄結(jié)構(gòu);對數(shù)據(jù)采取邊讀取邊轉(zhuǎn)換的方式,生成工作表單元格文件;在所述組件包目錄結(jié)構(gòu)下,生成所述工作表單元格文件的共享字符串文件和配置文件;對生成的上述各文件進行壓縮存,然后生成Excel格式的文件。本發(fā)明通過采用邊讀取邊轉(zhuǎn)換方式將數(shù)據(jù)導(dǎo)出成Excel文件,無需將大量對象保存在內(nèi)存內(nèi),且內(nèi)存不會隨保存數(shù)據(jù)的增加而增加,極大的減少了對內(nèi)存的占用。
文檔編號G06F17/22GK102760118SQ20111010361
公開日2012年10月31日 申請日期2011年4月25日 優(yōu)先權(quán)日2011年4月25日
發(fā)明者范登華 申請人:中興通訊股份有限公司