對於這個問題,我想大家都有共同的見解: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...