做視頻網(wǎng)站如何賺錢企業(yè)網(wǎng)站設(shè)計思路
在跨平臺環(huán)境中實現(xiàn)寫word時,如果用現(xiàn)成的庫,就會涉及跨平臺兼容性問題,比如在安卓與java中實現(xiàn)寫word的功能。還有一個問題就是,完全用程序生成word文檔,工作量較大。所以采用了模板替換的方法。
docx文檔本質(zhì)就是一個zip文件,只要將它的擴展名改成zip,就能解壓出一系列的xml文件與圖片文件,它的目錄結(jié)構(gòu)如下:
-
[Content_Types].xml:定義了文檔中所有文件的 MIME 類型。
-
_rels/:包含了文檔的元數(shù)據(jù)和關(guān)系信息,有一個特殊的文件
.rels
,定義了文檔的內(nèi)部鏈接和外部鏈接。 -
docProps/:這個文件夾包含文檔的屬性信息,如標(biāo)題、作者、主題等。
- app.xml:包含應(yīng)用程序特定的屬性;
- core.xml:包含核心屬性,如標(biāo)題、作者、創(chuàng)建日期等;
- custom.xml:包含自定義元數(shù)據(jù)。
-
word/:這個文件夾包含文檔的主要內(nèi)容和設(shè)置。
- document.xml:這是文檔的主要 XML 文件,包含了文本、樣式、段落、表格和其他內(nèi)容;
- footer1.xml:頁腳;
- header1.xml:頁眉;
- styles.xml:包含文檔中使用的樣式定義;
- settings.xml:包含文檔的設(shè)置,如頁面布局、標(biāo)題等;
- fontTable.xml:包含文檔中使用的字體列表;
- numbering.xml:包含文檔中的編號格式定義;
- theme/:包含文檔的主題信息,如顏色方案、字體方案等;
- media/:包含文檔中使用的圖像和其他媒體文件。
DOCX 文件的 XML 結(jié)構(gòu)是層次化的,通常以 w:document
作為根元素,然后包含以下主要部分:
- w:body:包含文檔的主體內(nèi)容,如段落 (
w:p
)、表格 (w:tbl
)、圖片 (w:drawing
) 等; - w:p:段落元素,包含文本和格式化信息;
- w:r:運行元素,表示文本的一段連續(xù)區(qū)域,可以包含文本 (
w:t
) 和格式化信息; - w:t:文本元素,包含實際的文本內(nèi)容;
- w:tbl:表格;
- w:tr,w:tc:表格中的行與列。
每個 XML 文件都遵循 OOXML 的命名空間規(guī)則,并且使用特定的 XML 模式進行定義。
主要內(nèi)容在word目錄下,通常關(guān)注word目錄下的document.xml,header1.xml、footer1.xml以及media子目錄下的圖片文件。
在程序中產(chǎn)生的數(shù)據(jù),通常是規(guī)則的,比如表格數(shù)據(jù)(如下圖),非常適合傳給freemarker,由它替換到word目錄下三個xml文件以及media子目錄下的文件。注意:圖片不能用base64格式,需要將它轉(zhuǎn)成二進制格式,一個小遺憾,如果能用,模板定義就更簡單了。
模板制作方法也很簡單:用office或wps寫一個文檔,定義好格式,在需要占位的地方寫上特定的內(nèi)容(只要在xml中容易找到就可以)。然后將docx擴展名改成zip,解壓后,在word目錄下的document.xml,header1.xml、footer1.xml中,將內(nèi)容都改成指定的占位符就行了。
freemarker的語法這里就不介紹了。freemarker在安卓中有點點問題,具體不記得了。我用的是js,把幾個xml文檔改成js程序,樣例如下:
var xml=[];
xml.push(`....`);
if(conditions...) xml.push(`....`)
.....
xml.join('');//輸出最后的內(nèi)容
把它們放到一個js引擎中,比如graalvm的js引擎,安卓上的quickjs引擎等,因為都是基本js語法,不會有兼容性問題。js執(zhí)行的最終輸出結(jié)果就是所需的xml文檔。
生成完畢,按原來的結(jié)構(gòu)壓縮成zip包,再改成docx擴展名就可以了。
至簡網(wǎng)格的服務(wù)器要在java與安卓中都能運行,兼容性就是個大問題,并且資源占用不可能像普通服務(wù)器那樣沒有節(jié)制,所以用的就是這種方法。因為本身要用js引擎做接口實現(xiàn)的擴展,所以js引擎是必須的,順帶著,部分模板就用js實現(xiàn)拼接。