国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

在線電子表格之?dāng)?shù)據(jù)存儲(chǔ)設(shè)計(jì)

2013-04-26 02:43:06王劉楊曹洪田雅
計(jì)算機(jī)光盤軟件與應(yīng)用 2013年1期
關(guān)鍵詞:存儲(chǔ)單元格

王劉楊 曹洪 田雅

摘要:本文通過(guò)設(shè)計(jì)了一種高效的中間存儲(chǔ)格式,即帶索引的XML文件,能隨機(jī)存取指定行的單元格,并且壓縮存儲(chǔ)大量重復(fù)的單元格,解決了在線電子表格的數(shù)據(jù)存儲(chǔ)問(wèn)題。

關(guān)鍵詞:在線電子表格;存儲(chǔ);XML;JavaScript;單元格

中圖分類號(hào):TP391.13 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2013) 01-0187-02

1 引言

在線電子表格是將應(yīng)用程序部署在服務(wù)器上,用戶通過(guò)瀏覽器訪問(wèn)的網(wǎng)絡(luò)版電子表格軟件,其功能類似于桌面版電子表格。由于系統(tǒng)本身功能復(fù)雜,要處理的數(shù)據(jù)量大,而網(wǎng)頁(yè)所使用的JavaScript和HTML語(yǔ)言的性能遠(yuǎn)遠(yuǎn)低于桌面版的Java、C++等語(yǔ)言,使得網(wǎng)絡(luò)版的開發(fā)難度比桌面版更大。

在線電子表格的界面通過(guò)網(wǎng)頁(yè)來(lái)顯示,一個(gè)電子表格文檔包含的數(shù)據(jù)量可能非常大,例如一個(gè)512k的ods文檔,就有1000*256個(gè)單元格填滿數(shù)據(jù),由于JavaScript創(chuàng)建對(duì)象的效率低、占內(nèi)存大,無(wú)法將這樣大量的數(shù)據(jù)裝載到客戶端內(nèi)存,因此讓客戶端只加載當(dāng)前顯示的那部分行數(shù)據(jù),由于客戶端數(shù)據(jù)不完整,所有編輯操作必須放在服須器端執(zhí)行。在服務(wù)器端執(zhí)行操作時(shí)文檔對(duì)象不能常駐內(nèi)存,因?yàn)榭赡苡泻芏辔臋n同時(shí)被在線編輯,內(nèi)存占用將非常大。用關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)每篇文檔也是不合適的,因?yàn)殡娮颖砀裎臋n的內(nèi)容是半結(jié)構(gòu)化的,適合用XML文件存儲(chǔ),這就意味著每個(gè)操作都要讀寫文件,對(duì)讀寫效率要求非常高。本文設(shè)計(jì)了索引文件+數(shù)據(jù)文件的存儲(chǔ)格式來(lái)實(shí)現(xiàn)隨機(jī)讀寫工作表的行數(shù)據(jù)。

2 文件存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)

一個(gè)電子表格文檔包含大量數(shù)據(jù),由于Web版電子表格每個(gè)編輯操作都要讀寫文件,為了提高讀寫效率,我們分成多個(gè)文件來(lái)存儲(chǔ),這樣每次只需讀寫與當(dāng)前操作相關(guān)的數(shù)據(jù)文件,而不需要為無(wú)關(guān)的數(shù)據(jù)耗費(fèi)開銷。目錄結(jié)構(gòu)如圖所示:

當(dāng)從本地上傳或從服務(wù)器打開一個(gè)電子表格文檔

時(shí),通過(guò)生成一個(gè)唯一的ID,在存儲(chǔ)服務(wù)器上創(chuàng)建一個(gè)名為book+ID的工作簿文件夾。

2.1 book.xml存儲(chǔ)工作簿的信息,包括:風(fēng)格、默認(rèn)行高列寬、所有區(qū)域命名等,還有若干工作表節(jié)點(diǎn),記錄工作表的名稱和隱藏屬性等。此外,在每個(gè)工作表節(jié)點(diǎn)下還有公式和圖表所引用的單元格地址,之所以把它們放在book.xml中而不是在各自的工作表文件中,是因?yàn)樗鼈兌伎梢钥绫硪?,這意味著對(duì)一個(gè)工作表中的單元格區(qū)域做了修改,需要查找所有工作表中的公式、圖表看是否需要修改,為了提高查詢效率,把它們集中放在一個(gè)文件中。

2.2 charts文件夾下存放圖表的信息,每個(gè)圖表一個(gè)xml文件,包括圖表的尺寸、坐標(biāo)、引用的圖片地址、標(biāo)題、圖例以及x、y屬性。

2.3 sheet+ID文件夾下存放一個(gè)工作表的全部?jī)?nèi)容,ID在創(chuàng)建工作表時(shí)由系統(tǒng)生成。

該文件夾包括:

(1)table.xml存儲(chǔ)行列的高寬及隱藏屬性、合并單元格、篩選器和插入的圖片地址等信息。其中行、列節(jié)點(diǎn)依序排列,用屬性“repeat='n'”來(lái)記錄連續(xù)n行(列)有相同的屬性,例如:

表示第100列設(shè)置了列寬為0.3cm,其他都是默認(rèn)列寬。

(2)content.txt存儲(chǔ)單元格的內(nèi)容,其格式仍然是xml,但為了能隨機(jī)讀寫,不能帶最外層的根節(jié)點(diǎn),因此存為.txt。數(shù)據(jù)按照工作表的行存儲(chǔ),基本結(jié)構(gòu)為"......",由于每個(gè)工作表有65536*256個(gè)單元格,很容易產(chǎn)生大量樣式重復(fù)又無(wú)內(nèi)容的行列,為了節(jié)省存儲(chǔ)空間,用"repeat"屬性記錄完全相同的連續(xù)n行或n個(gè)單元格。存儲(chǔ)示例:

表示第100行第3列單元格有字符串類型的數(shù)據(jù)"abc"。上的屬性還有公式表達(dá)式、數(shù)字格式碼、真實(shí)值、超鏈接等等。

一個(gè)工作表可能有很多行有數(shù)據(jù),如果每次修改一個(gè)單元格就要對(duì)整個(gè)文件全讀全寫是很費(fèi)時(shí)的。Java可以隨機(jī)讀寫文件,但必須知道從第幾字節(jié)開始讀寫,本文設(shè)計(jì)了索引文件contentIndex.txt來(lái)記錄content.txt文件中每個(gè)節(jié)點(diǎn)的起始字節(jié)和長(zhǎng)度,每對(duì)索引值的長(zhǎng)度是固定的,因此能夠計(jì)算出工作表第n行的索引在索引文件中的起始字節(jié),從而讀出索引值,再讀取數(shù)據(jù)文件。寫回?cái)?shù)據(jù)文件時(shí)直接添加在最末尾,同時(shí)更新其索引值。數(shù)據(jù)不能寫入到原有位置,因?yàn)镴ava的隨機(jī)寫文件是覆蓋相同長(zhǎng)度的內(nèi)容而非插入。之所以對(duì)建立索引而不是,是因?yàn)?cell>節(jié)點(diǎn)太多,會(huì)導(dǎo)致索引文件很大,降低索引文件的讀寫效率。

(3)styles.txt存儲(chǔ)單元格的樣式屬性,結(jié)構(gòu)與content.txt相同,將內(nèi)容和樣式分開存儲(chǔ)是因?yàn)槎鄶?shù)操作不會(huì)同時(shí)修改樣式和內(nèi)容,這樣避免了讀寫無(wú)關(guān)的數(shù)據(jù)。同樣為styles.txt中的節(jié)點(diǎn)建立了索引文件stylesIndex.txt。樣式屬性包括字體、字號(hào)、粗斜體、下劃線、字符顏色、背景顏色、對(duì)齊方式和單元格邊框等等。

2.4 history文件夾存放每個(gè)操作的歷史記錄,用于撤銷和恢復(fù)詳細(xì)存儲(chǔ)格式。Pictures文件夾存放插入到工作表中的圖片。

3 服務(wù)器端數(shù)據(jù)模型

從文件中讀出的單元格數(shù)據(jù)要建立一定的數(shù)據(jù)模型才能進(jìn)行邏輯操作,由于一次讀取的單元格可能很多,如果直接用DOM對(duì)象,會(huì)內(nèi)存溢出。我們?cè)O(shè)計(jì)了一套與文件存儲(chǔ)結(jié)構(gòu)對(duì)應(yīng)的數(shù)據(jù)對(duì)象,采用SAX(Stream API for XML)解析方式, 它占用內(nèi)存很小,每次讀入一段字符流解析,遇到節(jié)點(diǎn)的起始標(biāo)簽、內(nèi)容和結(jié)束標(biāo)簽分別觸發(fā)相應(yīng)的事件,調(diào)用相應(yīng)的回調(diào)函數(shù),創(chuàng)建我們自定義的數(shù)據(jù)模型。如圖所示:

Cell和Style是基本元素,分別存儲(chǔ)單元格內(nèi)容和樣式,它們都實(shí)現(xiàn)IRepeatItem接口,即都帶repeat屬性,表示同行的連續(xù)n個(gè)單元格。Row代表工作表中的行對(duì)象,也實(shí)現(xiàn)IRepeatItem,一個(gè)Row對(duì)象可以表示連續(xù)n個(gè)數(shù)據(jù)完全相同的行。Row對(duì)象含有Cell或Style對(duì)象的數(shù)組,該數(shù)組類型為RepeatList,它的元素必須實(shí)現(xiàn)IRepeatItem,RepeatList提供了一系列訪問(wèn)數(shù)組元素的方法,包括按行號(hào)增加、刪除、獲取和拆分元素,當(dāng)選中一片單元格區(qū)域進(jìn)行修改時(shí),可能需要把邊界的Row 或Cell/Style對(duì)象拆分為兩個(gè)。RowsList代表連續(xù)n行,含有Row對(duì)象的數(shù)組,它的start屬性記錄起始行號(hào)。

4 前后臺(tái)數(shù)據(jù)交互格式

4.1 操作指令

客戶端接收到用戶的操作后,發(fā)送操作指令給服務(wù)器進(jìn)行處理。操作指令為xml格式的字符串,標(biāo)簽名即操作名稱,屬性包括:工作簿ID,工作表ID,選中的單元格區(qū)域和要設(shè)置的屬性等等。例如:

表示設(shè)置第1行第5列到第2行第5列這個(gè)矩形區(qū)域的字體為"Georgia",rooSessionId是每個(gè)窗口的唯一ID,用于服務(wù)器端分別記錄不同窗口的操作歷史,以便撤銷和恢復(fù)。

4.2 返回?cái)?shù)據(jù)

服務(wù)器端處理完操作后返回?cái)?shù)據(jù)給客戶端,格式為JSON(JavaScript ObjectNotation),它是一種輕量級(jí)的數(shù)據(jù)交換格式,它與JavaScript定義對(duì)象的語(yǔ)法相同,可以直接轉(zhuǎn)化為JavaScript的對(duì)象,解析效率高。返回?cái)?shù)據(jù)格式的設(shè)計(jì)必須涵蓋工作簿全部信息,且盡量簡(jiǎn)短,以縮短網(wǎng)絡(luò)傳輸時(shí)間和解析時(shí)間。AJAX的回調(diào)函數(shù)接收到這個(gè)JSON對(duì)象后,遍歷每個(gè)工作表對(duì)象,取出各個(gè)子對(duì)象,包括工作表信息、單元格信息、圖表、媒體、合并單元格、篩選器等,交給相應(yīng)的處理器更新內(nèi)存數(shù)據(jù)以及界面元素。

參考文獻(xiàn):

[1]David Hunter,Jeff Rafter,Joe Fawcett. XML入門經(jīng)典[M].清華大學(xué)出版社.

[2]David Flanagan.JavaScript權(quán)威指南[M].機(jī)械工業(yè)出版社.

猜你喜歡
存儲(chǔ)單元格
玩轉(zhuǎn)方格
玩轉(zhuǎn)方格
淺談Excel中常見統(tǒng)計(jì)個(gè)數(shù)函數(shù)的用法
西部皮革(2018年6期)2018-05-07 06:41:07
檔案管理中電子文件的存儲(chǔ)探究
條形碼技術(shù)在涂裝生產(chǎn)中的應(yīng)用
云計(jì)算與虛擬化
大型機(jī)電設(shè)備出口包裝防護(hù)
Excel?。玻埃埃爸袉卧駭?shù)據(jù)的自動(dòng)更新
望奎县| 海原县| 海宁市| 兴安县| 丘北县| 长葛市| 广宗县| 临湘市| 偃师市| 玉龙| 云和县| 通化县| 黄冈市| 涪陵区| 城固县| 乌苏市| 嘉定区| 长葛市| 芦山县| 云阳县| 德钦县| 吐鲁番市| 无锡市| 峡江县| 福清市| 兰西县| 涞源县| 遵义县| 北碚区| 颍上县| 碌曲县| 潼南县| 大冶市| 庄河市| 镇远县| 辽阳市| 平南县| 平罗县| 黎城县| 徐州市| 鄂伦春自治旗|