乾貨 java使用xml方式快速生成word

2021-09-05 11:27:04 字數 2005 閱讀 9163

對於這個問題,我想大家都有共同的見解:poi對於word的支援實在是太差了!

在我參與的乙個專案中,我負責做乙個根據模板檔案,從資料庫中提取相應的資料,生成乙個word檔案的模組,但是在我使用poi時候,我發現我沒有辦法將文字和所其中穿插的放到同乙個模板標籤中,所以我第一想法就是:先替換標籤,再填充資料唄!可是通過實際驗證,發現我的想法錯了。

在第一步替換新的模板標籤的時候,我發現,它們依然是隸屬於同一paragraph的,而所帶來的問題就是,填充資料的時候,雖然能將文字和填充進去,但是他們是隸屬於同一paragraph,所以最終結果就是格式混亂,所有文字都在的上邊。

那麼我只要把每個標籤都放在乙個新的段落,就可以了啊!怎麼弄呢。。。有了!在word中,換行就是乙個新的段落了啊!!nice,這就開始做!換行好像是\n,試一下,不行!\r\n,不行,在wps中,\r\n可以被解析為換行,但是在office word中,卻不行!那怎麼辦,要不直接新增乙個換行吧!

但是在實際擼碼中,才發現,這倆好像對於我的需求沒啥用啊。。。

對poi心灰意冷的我,發現了,可以通過xml來生成word … …

首先,就是在製作模板了,開啟我手上的word模板,另存為xml格式!對於如何製作,大體上我是以下的思路:

比對空文件和空文件新增乙個文字段落,通過比較找出段落的樣式

比對空文件和空文件新增乙個段落,通過比較找出段落的格式

比對空文件和插入兩個段落,通過比較找出多個段落的排列結構

首先找到文字的段落吧!

通過比對,發現,在xml中,文字的段落是如下格式的:

其實,在生活中,人們。。。

哈哈,找到文字啦!!

那麼如果有多個段落呢???再找找看!!!

其實,在生活中,人們。。。

還有很多的事情

我去!不對啊!怎麼跟我剛才的不一樣???原來,標籤才是word中代表乙個段落的標籤!!所以之後的尋找也明確了,重點看!!

然後通過比對,我也找到了的標籤(過程就省略了,直接上標籤!):

此處為的base64編碼

現在,只需要通過把原先的段落位置改變為模板標籤,通過對我上述的標籤的拼接,然後替換掉模板標籤,再將xml轉換成word就大功告成啦!!!

/**

* @title: createword

* @description: todo 將資料新增到xml中,並生成word檔案

* @param: map 需要替換資料的map

* @param: templatename 模板名稱

* @param filepath 想要生成的檔案的路徑

* @param filename 想要生成的檔案的名字

* @return: string 返回生成檔案位址

* @throws

*/public static string createword(map map, string templatename, string filepath, string filename)

writer out = new bufferedwriter(

new outputstreamwriter(

new fileoutputstream(outfile), "utf-8"));

template.process(map, out);

out.flush();

out.close();

return filepath + file.separator + filename;

} catch (exception e)

return null;

}

如果大家有什麼問題,歡迎聯絡我啊!如果有什麼問題,也希望大家批評指正!

email: [email protected]

Xml快速讀取方式

讀寫xml的選擇順序比較 xmldocument xdocument會將xml全部載入到記憶體,造成記憶體浪費,不適合大資料xml處理。xmlreader 以及子類xmltextreader 則適合快速的讀取,它是唯讀的,並且只向前讀取。其讀取的效能比xml linq快 xml linq 則是.ne...

使用DOM方式解析XML

一 建立乙個xml檔案 如下圖 二 解析xml檔案 public class domtest 解析book節點的子節點 nodelist childnodes book.getchildnodes 遍歷childnodes獲取每個節點的節點名和節點值 for int k 0 k 區分出text型別的...

使用XML方式與JSON方式返回資料

public class videoservice 解析伺服器返回的協議,得到資訊 param instream return throws exception private static listpar ml inputstream instream throws exception if vi...