999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Word模板的復雜文檔快速生成方法

2020-10-15 11:00:54黎茂鋒劉志勤
計算機應用與軟件 2020年10期
關鍵詞:引擎指令文本

駱 蓉 黃 俊 黎茂鋒 劉志勤

(西南科技大學計算機科學與技術學院 四川 綿陽 621010)

0 引 言

Word作為一款功能強大的字處理軟件,廣泛應用于各個行業。在各類數據分析系統開發場景中,往往需要動態生成Word形式的數據分析報告。這些報告通常邏輯結構復雜,數據展現形式多樣,包含了文本、表格、公式、圖片等,有的甚至需要在已有的表格內再嵌入圖片或者表格,并且報告的生成對內容格式與排版的要求非常嚴格。一些Word報告包含的數據量十分龐大,可達幾百頁之多。對于這樣復雜的Word報告,直接使用COM組件技術[1]、ActiveX技術[2]和Jacob技術[3]等開發技術硬編碼生成Word文檔,不僅耗時費力,且代碼量大,可讀性差,不利于后期修改維護。

針對以上問題,目前有兩種較好的解決方案。第一種為Word模板替換法[4-6],開發者預先制定帶有動態內容的Word模板,再通過相應開發工具包解析替換模板中的占位內容,生成新的文檔。該方法直接以Word文檔為模板,內容的格式與排版可直接通過Office軟件完成,減小了程序的復雜性,便于后期的修改維護,但文檔生成效率不高,只適用于較小數據量的Word文檔生成場景。第二種為模板引擎生成法[7-9],開發者仍然需要先制作Word文檔,并另存為Word 2003 xml文檔,再通過模板引擎的相關語法修改xml文檔中的動態內容,形成新的模板。使用模板引擎解析該模板并填充數據,輸出最終的.doc文檔。該方法很大程度上提高了文檔的生成效率,但生成的文檔較大,開發者需要花費大量的時間制作模板,且當文檔樣式改變時,必須重新訂制對應的模板,不利于修改維護。因此,如何平衡該類文檔的生成效率、開發維護難度與工作量,是目前亟需解決的問題。

針對現有方法的不足,本文提出了一種基于Word模板的復雜文檔快速生成方法,實現了文檔的高生成效率和低開發成本。基于Office Open XML規范(OOXML)[10]實現了Word文檔的自動生成,并通過Word文檔自動生成主文檔部件documen.xml的Enjoy模板,使得開發者既能使用Word模板加快開發速度,又能使用Enjoy模板引擎提高文檔生成效率。對比實驗表明,本文方法在文檔生成效率以及文檔生成大小上綜合最優。

1 相關技術

1.1 OOXML

Office Open XML為Microsoft開發的一種以XML為基礎并以ZIP格式壓縮的電子文件規范,支持文件、表格、備忘錄和幻燈片等文件格式[11]。在MS Word 2007及之后版本中,OOXML替代了傳統的二進制格式,成為Word文檔的默認存儲格式,Word文檔擴展名由.doc變為.docx。目前,有不少研究人員與開發者利用該規范構建Word文檔生成與修改的解決方案[12-14]。

在OOXML格式下,Word文檔由一個壓縮的ZIP包組成,解壓縮后可得到Word文檔的內部組織結構,如圖1所示。Word文檔由文件夾和文件組成,這些文件被稱為部件(part),每個部件定義了文檔的特定信息。_rels文件夾用于定義ZIP包的部件關系;docProps文件夾用于定義應用程序的屬性部件;word文件夾用于定義文檔主體內容,包含存放關系部件的res文件夾、存放文檔主題樣式的theme文件夾、存放多媒體內容的media文件夾、存放正文的主文檔部件document.xml,以及存放整體樣式的樣式部件style.xml等文檔內容部件;[Content_Types].xml文件用于定義文檔各個部件的屬性信息以及內容類型。因此,修改模板中的相應部件后,與該模板中的其他部件一同壓縮就能生成目標Word文檔。本文根據上述原理制定了Word文檔的生成策略。

圖1 Word文檔內部組織結構

Word文檔中的部件使用WordprocessingML語言[15]進行描述,其形式符合XML的基本規范。由于提出的復雜文檔快速生成方法主要是對document.xml文件進行操作,特將該文件中的核心元素以及結構做一個簡單說明。在document.xml文件中,元素w:body代表正文主體框架,由多個塊級元素組成,如段落元素w:p和表格元素w:tbl。其中:w:p可包含多個連續文本范圍元素w:r,而每一個w:r又可包含文本元素w:t或繪圖元素w:drawing;w:tbl由多個行元素w:tr組成,在w:tr中可包含多個單元格元素w:tc,而每一個w:tc又可以包含多個w:p和w:tbl。本文根據document.xml的xml結構設計了Enjoy模板生成方法。

1.2 Enjoy模板引擎

Enjoy引擎模板是JFinal框架的組成部分,可單獨使用。它是一個由Java編寫的極輕量級的模板引擎,大小僅為227 KB[16]。相比于FreeMarker和Velocity等傳統模板引擎,Enjoy不依賴第三方工具進行詞法分析和語法分析,具有更優的性能。此外,Enjoy僅含7個核心指令,在表達式規則的設計上也盡可能沿用Java的語法規則,且基于空合操作符,實現了安全取值、安全調用,避免顯式判斷空值操作,使得模板制作更加容易。本文選擇使用Enjoy模板引擎生成主文檔部件document.xml。

1.3 DOM4J

DOM4J是一個開源的Java XML API,它提供了大量的操作XML文件的接口,其性能優異,功能強大,簡單易用[17]。本文使用DOM4J技術讀取并修改document.xml文件。

2 方法設計

2.1 總體設計

根據OOXML規范,本文方法直接以Word文檔作為模板,通過復制模板中的所有部件并修改特定部件中的內容生成目標文檔,總體設計如圖2所示。本文生成的Word文檔主要是對模板中正文內容的修改,涉及的部件有document.xml、document.xml.rels,以及[Content_types].xml文件,這三個xml類型文件可直接通過DOM4J技術進行修改。但當目標文檔中填充的數據量較大時,就需在document.xml中頻繁添加樹節點,使得文檔的生成效率變低。對此,引入Enjoy模板引擎技術生成document.xml。

圖2 復雜文檔生成方法總體設計

引入Enjoy模板引擎后,開發者必需在document.xml文件中插入Enjoy指令生成新的Enjoy模板。為了簡化開發,本文基于Enjoy指令,設計并實現了一套Word模板指令集,該指令集完成了指令規范化與指令解析,可自動生成document.xml的Enjoy模板。因此,開發者只需在Word模板中編寫動態內容及其邏輯控制,而不用關心對應Enjoy模板的生成過程。

2.2 Enjoy模板的自動生成

開發者通過在Word模板中直接使用Enjoy指令編輯動態內容來生成document.xml文件的Enjoy模板是不可行的。主要原因有以下兩點:(1)開發者在生成document.xml文件的Enjoy模板時,應該修改文本元素w:t或繪圖元素w:drawing的屬性實現動態文本、圖片的標記,并在相關元素的前后位置插入#for、#if等指令控制內容邏輯。但在使用Word軟件編輯模板時,所有的指令均被視為段落中的文本,存儲于w:t中,而不能插到w:drawing及相應元素的前后位置上。(2)Word模板中的指令轉換成xml形式時,通常會被拆分,存儲在多個w:t中,Enjoy模板引擎無法解析。針對這兩個問題,本文在Enjoy指令的基礎上,設計了一組模板指令,用于標記Enjoy指令在document.xml中的位置,實現了指令規范化以及指令解析,使得開發者可直接通過Word文檔生成Enjoy模板。

2.2.1模板指令設計

模板指令由兩部分信息組成。一部分為實際操作動態內容與邏輯的Enjoy指令;另一部分為Enjoy指令在document.xml中的位置信息。

根據以往開發者手動生成Enjoy模板的經驗可知:Enjoy插值指令#()出現的位置主要在文本元素w:t以及繪圖元素w:drawing的特定屬性中。#if、#for、#switch等邏輯控制指令出現的位置主要在塊級元素w:p和w:tbl、運行元素w:r,以及行元素w:tr的前后位置之間。據此,設計了如下模板指令。

(1)文本輸出指令。由于動態文本的位置就在元素w:t中,不需要改變位置,可直接使用Enjoy模板引擎的插值指令:#(para),para的取值為基本類型、對象的屬性或者數組中的一個元素等。

(2)圖片輸出指令。圖片信息存儲于繪圖元素w:drawing中,考慮到圖片的循環輸出,需要修改w:drawing中的wp:docPr、pic:cNvPr,以及a:blip元素中的屬性值。由于要替換多個參數,為了降低模板制作的復雜度,將上述需要修改的屬性封裝到圖片類中。定義圖片輸出指令為:@pic(picObj),picObj參數只能是圖片類實例。為了方便解析,在圖片輸出指令后放置樣例圖片,并保證指令與樣例圖片放在一個段落中。解析過程中,需要將picObj的屬性分別插入到w:drawing的相應位置;為防止picObj為空所導致的文檔生成錯誤,需要在w:r之前判斷該參數是否為空。

(3)塊級邏輯指令。為了實現段落、表格間的邏輯控制,定義塊級邏輯指令:@blk(stats),參數stats為一個或多個Enjoy模板引擎中的邏輯控制指令。解析時,會直接將該指令所在的w:p替換為stats指令。

(4)運行邏輯指令。為了實現段落內的邏輯控制,定義運行邏輯指令:@run(stats),參數stats為一個或多個Enjoy指令。解析時,stats會取代該指令所在的w:r。

(5)行邏輯指令。為了實現表格行的邏輯控制,定義行邏輯指令:@befTr(stats)和@aftTr(stats),分別代表在當前指令所在的w:tr之前插入stats指令和在當前指令所在的w:tr之后插入stats指令。

2.2.2指令規范化

指令規范化是指把分散到多個w:r中的模板指令合并到第一個w:r中。由于完整的指令存儲在段落w:p中,所以只需要遍歷所有w:p進行指令規范化即可,具體方法如下:獲取所有的段落元素w:p;對于每一個w:p,依次獲取含有文本元素w:t的運行元素w:r,并將w:t的內容追加至buf數組中;通過詞法分析算法對buf數組進行模板指令識別,記錄每一個模板指令開始的w:r和結束的w:r;合并開始w:r到結束w:r之間的文本內容,實現模板指令的規范化;直到所有的段落遍歷結束,指令規范化完成。指令規范化流程如圖3所示。

圖3 指令規范化流程

指令規范化執行完成后,在一個w:t中,可能既包含靜態文本,又包含模板指令。

2.2.3指令解析

指令解析主要是將模板指令中的Enjoy指令放到正確的位置,具體步驟如下:使用DOM4J技術加載document.xml文件,生成對應的dom樹,獲取所有的w:p;遍歷w:p,獲取當前w:p中所有含有w:t的w:r;對于每個w:r,獲取w:t的文本內容并按照指令類型劃分成多個模板指令(將靜態文本處理視為文本輸出指令);分別根據指令類型對每一個模板指令進行處理,由于使用DOM4J不能直接在元素的前后位置插入Enjoy指令,因此創建占位元素進行標記,使用Map集合記錄占位元素的信息與對應的Enjoy指令;直到所有的模板指令都處理完成后,刪除當前w:r;將dom樹轉化為字符串,并把所有的占位元素替換為對應Enjoy指令。指令解析流程如圖4所示。

圖4 指令解析流程

指令解析完成后,即完成了Enjoy模板的生成。

2.3 Word文檔生成

Word文檔生成之前需要準備數據,由于圖片的生成涉及document.xml.rels與[Content_types].xml文件的修改,因此將文本數據與圖片數據分離,分別以樹狀結構進行組織,便于后續對圖片進行操作。

在準備好Word模板、Enjoy模板以及數據之后,基于OOXML生成Word文檔的具體流程如下。首先判斷是否涉及圖片的生成:如果不涉及,則直接通過Enjoy模板引擎技術將文本數據填充到Enjoy模板中,生成新的document.xml文件,將其與Word模板的其他部件一同壓縮輸出,得到目標文檔;如果涉及圖片的生成,則需要獲取所有的圖片信息,將其轉化為圖片類,添加到文本中,并統計圖片的內容類型以及記錄引用關系。再通過Enjoy模板引擎生成document.xml文件,復制Word模板中的document.xml.rels與[ContentTypes].xml文件,并分別追加圖片的引用關系與內容類型。最后將圖片數據寫入word/media/文件夾中,同時將新生成的部件與Word模板中的其他部件一起壓縮輸出,得到目標文檔。文檔生成的核心步驟如算法1所示。

算法1文檔生成算法

輸入:Word模板文件wFile,Enjoy模板文件eFile,文本數據模型dataMap,圖片數據picMap。

輸出:目標文檔dirWord。

Procedure WordGeneration

1.if picMap=null then

%生成document.xml文件

2.docXML ← genDocumentXML(eFile,dataMap)

%將document.xml與Word模板的其他的部件一同壓縮輸出

3. dirWord ← replaceWordPart(wFile,docXML)

4. else

%將圖片數據轉換為圖片類

5. picClassMap ← picMap2PicClassMap(picMap)

%將圖片的信息添加到文本數據模型

6. dataMap.add(picClassMap)

7. docXML ← genDocumentXML(eFile,dataMap)

%獲取模板中的[ContentTypes].xml文件

8. typesXML ← getContentTypesXML(wFile)

%追加圖片的內容類型

9. typesXML ← addContentTypes(typesXML, picMap)

%獲取模板中的document.xml.rels文件

10. docRelsXML ← getDocResXML(wFile)

%追加圖片的引用信息

11.docRelsXML ← addPicRes(docResXML, picClassMap)

%將部件壓縮輸出到目標文檔中

12.dirWord ← replaceWordPart(wFile, docXML, typesXML, docRelsXML)

%把圖片數據寫入word/media/文件夾

13. addPic(dirWord, picClassMap)

14. end if

15.return dirWord

3 應用實例

目前,本文方法已經成功應用于某氣動數據庫系統中,實現了氣動設計數據手冊、過程文檔、分析報告等多種文檔的快速、準確生成。這些文檔為飛行器研究人員提供了氣動數據分析、優化、決策依據。氣動數據量大、維度高、結構復雜等特點[18]使得飛行器研制過程復雜,利用傳統方法生成相應的文檔難度很大;同時,文檔的生成還需要根據不同的研究方向和行業需求進行定制,工作量巨大。而使用本文提出的方法極大地降低了開發難度,減少了工作量,提高了系統的研發效率。

以系統中數據分析報告的生成為例,該報告中包含了氣動數據集來源、數據類型等統計信息,另外還包含了大量的表格、圖像等數據分析內容。通過本文設計的指令集實現的該報告Word文檔模板如圖5所示。

圖5 某氣動數據庫系統項目的分析報告模板

通過該模板可以對圖片、表格、表格行等動態內容進行添加,并對這些內容進行結構上的邏輯控制。采用本文方法生成的數據分析報告實例如圖6所示。

圖6 某氣動數據庫系統項目的分析報告實例

可以看出,圖6中固定文本、樣式等靜態內容與圖5完全一致;表格、圖像等動態數據也按照預期填充到了模板中的相應位置。

上述實例表明,本文方法操作簡單,易于理解,降低了開發成本,便于后期維護,具有較好的實用性。

4 實 驗

4.1 實驗環境

所有實驗均在普通PC上進行。硬件環境:處理器為Intel(R)Core(TM)i5-2520M @ 2.5 GHz,內存為4 GB。軟件環境:Windows 10 專業版,MyEclipse 2017,JDK1.8。

4.2 性能對比與分析

將本文方法與文獻所提兩種復雜文檔生成方法的生成效率以及文檔大小進行對比,來分析本文方法的性能。方法1為Word模板替換法,選用POI解析Word文檔替換動態內容,生成docx文檔;方法2為模板引擎生成法,借助FreeMaker模板引擎生成doc文檔。

4.2.1文檔生成效率分析

以生成不同表格行數和不同圖片數量的Word文檔來對比這三種方法的文本生成效率。在實驗中,不考慮數據準備所耗用的時間。

在表格實驗中,循環行為7列,三種方法生成文檔所用時間如圖7所示。

圖7 三種方法生成表格文檔所用時間

可以看出,方法1的文檔生成時間隨表格行數的增加而急劇上升,文本生成效率較低(由于該方法生成10 000行表格文檔所用時間較長,因此未在圖中給出其生成100 000行表格文檔的時間);方法2與本文方法隨著行數的增加,總時間增加,但是漲幅不大,文本生成效率更高。在10 000行以內,本文方法略優于方法2,但隨著表格行數的繼續增加,本文方法與方法2之間的時間差距變小;10 000行后,方法2略高于本文方法。出現該趨勢的原因是:方法2的總耗時由模板解析時間及文檔輸出時間組成,而本文方法的總耗時還包含了文檔壓縮時間;當數據量較小時,本文方法壓縮輸出document.xml文件的時間占比小,而Enjoy模板引擎的解析性能優于FreeMaker模板引擎,本文方法比方法2更優;但隨著數據量的增大,Enjoy模板的解析時間占總時間的比例越來越小,而壓縮輸出document.xml文件占總時間的比例越來越大,最終導致本文方法略低于方法2。

在圖片實驗中,所用圖片大小在幾十到幾百KB之間,三種方法生成不同數量圖片的Word文檔所用時間如圖8所示。

圖8 三種方法生成圖片文檔所用時間

可以看出,方法1的文檔生成時間隨圖片數量的增加而大幅度增加;方法2與本文方法的文檔生成時間隨圖片數量的增加而小幅度增加,且本文方法優于方法2。

通過實驗證明,方法2與本文方法的文檔生成效率接近,均高于方法1。

4.2.2文檔大小分析

Word文檔的大小會影響文檔下載的速度以及打開Word文檔的速度。因此,本文將其作為一個評價指標,分別比較了三種方法生成的Word文檔大小。

三種方法生成不同表格行數的Word文檔大小如表1所示。

表1 三種方法生成表格文檔大小 KB

方法1與本文方法的文檔大小隨著表格行數的增加少量增長,而方法2則急劇上升,在10 000行時,其大小約為本文方法的44倍。這是由于文檔格式的差異造成的,方法1與本文方法生成的Word文檔格式為OOXML,方法2生成的Word格式為二進制格式,OOXML存儲文檔采用了ZIP壓縮技術,有效地減小了文檔的大小。

三種方法生成多幅圖片的Word文檔大小如表2所示。

表2 三種方法生成圖片文檔大小 KB

在生成相同數量圖片的文檔時,方法1與本文方法生成的文檔較小,方法2生成的文檔較大。隨著圖片數量的增加,方法1與本文方法的優勢更加明顯。原因是方法1與本文方法對圖片進行了壓縮存儲,減少了圖片的大小,方法2將圖片轉換為Base64編碼進行存儲,沒有進行壓縮。

綜上所述,在文檔生成的時間上,本文方法與方法2效率相近,皆高于方法1。在文檔生成的大小上,本文方法與方法1生成的文檔大小接近,都小于方法2。因此,本文方法總體上優于其他兩個方法。

5 結 語

本文針對現有的復雜Word文檔生成方案存在的開發復雜與工作量大的問題,提出了一種基于Word模板的復雜文檔快速生成方法。該方法基于OOXML規范制定了Word文檔生成策略,可直接使用Word文檔作為模板。同時設計了一組模板指令,實現了指令規范化與指令解析,能夠自動將document.xml文件轉換為Enjoy模板,在引入Enjoy模板引擎技術提高效率的同時,解決了Enjoy模板制作復雜和后期修改維護困難等問題。通過實例分析,并與已有的兩種方法進行了性能對比,證明了本文方法的可行性、實用性、高效性。

猜你喜歡
引擎指令文本
聽我指令:大催眠術
在808DA上文本顯示的改善
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
基于doc2vec和TF-IDF的相似文本識別
電子制作(2018年18期)2018-11-14 01:48:06
藍谷: “涉藍”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
文本之中·文本之外·文本之上——童話故事《坐井觀天》的教學隱喻
無形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開發
如何快速走進文本
語文知識(2014年1期)2014-02-28 21:59:13
主站蜘蛛池模板: 国内精品久久久久鸭| 精品亚洲欧美中文字幕在线看| 超碰aⅴ人人做人人爽欧美 | 天堂av高清一区二区三区| 亚洲欧美天堂网| 成人精品区| 亚洲天堂成人| 国产人人射| 一级毛片在线免费视频| 99偷拍视频精品一区二区| 国产美女免费| 国产国模一区二区三区四区| 国产精品妖精视频| 亚洲成人在线免费观看| 极品国产在线| 无码高潮喷水专区久久| 亚洲精品日产精品乱码不卡| 喷潮白浆直流在线播放| 九九线精品视频在线观看| 人妻少妇乱子伦精品无码专区毛片| 亚洲av色吊丝无码| 精品人妻系列无码专区久久| 国产又色又刺激高潮免费看| 国产黄色爱视频| 日韩AV手机在线观看蜜芽| 欧美激情视频一区| 91啪在线| 凹凸精品免费精品视频| 毛片免费在线视频| 色窝窝免费一区二区三区| 国产尤物视频在线| 日本三级精品| 久久99蜜桃精品久久久久小说| 国产精品第一区在线观看| 波多野结衣二区| 毛片在线播放a| 乱码国产乱码精品精在线播放| 亚洲永久精品ww47国产| 久久国产精品影院| 亚洲精品国产乱码不卡| 亚洲国产日韩视频观看| 成人免费一区二区三区| 熟妇无码人妻| 福利一区三区| 日韩精品一区二区三区免费| 亚洲精品第一在线观看视频| 亚洲av日韩综合一区尤物| 91精品视频在线播放| 精品国产成人a在线观看| 成人精品亚洲| 凹凸国产分类在线观看| 国产丝袜无码精品| 免费观看成人久久网免费观看| 国产综合色在线视频播放线视| 99re精彩视频| 日韩毛片视频| 国产一区二区网站| 日本午夜视频在线观看| 欧美另类精品一区二区三区 | 99视频在线免费观看| 91麻豆国产精品91久久久| 国产精品尹人在线观看| 欧美精品xx| 亚洲免费播放| 88av在线| 最新日本中文字幕| 欧美国产另类| 精品色综合| 有专无码视频| 国内黄色精品| 99尹人香蕉国产免费天天拍| 日本黄色a视频| 日韩国产高清无码| 久久综合干| 亚洲人成人伊人成综合网无码| 久久国产黑丝袜视频| 伊人色婷婷| 最新国产你懂的在线网址| 国产成人精品一区二区免费看京| 日本手机在线视频| 精品成人一区二区三区电影 | 男人天堂伊人网|