一、問題描述
通過poi,把word中的佔位符替換為實際的值,以生成複雜結構的業務報告。
在poi 3.9上,功能正常。由於某些原因公升級到poi 3.10.1後,專案組反饋說word模板出錯,無法生成word檔案,總是報解析錯誤。
二、問題分析
word模板功能相關的**應該說是比較穩定了,相關**很久沒有變動過,而且已經有投產專案在正式使用。現在出了問題,應該是公升級poi版本導致的。
word模板內容示例:
本期產品為向$發行的混合類理財產品,本期產品投資期限為$天,收益率為$%/年,為$類產品,到期還本付息。是一款具有投資安全性高、回報率高重點的理財產品。
分析、除錯**。發現兩個版本的poi在處理paragraph.getruns()有區別:
3.9版本:乙個段落就是乙個xwpfrun;
3.10.1版本:乙個段落不知道根據什麼規則,胡亂分成了list。如上述示例模板,會被切換為長度為14的list;
這樣就導致獲取、替換段落文字時出錯。
三、問題解決
問題被定位後,就嘗試解決。主要的思路,就是強制把list中的內容合併成乙個字串,替換內容後,把段落中的xwpfrun全部remove掉,然後新建乙個含有替換後內容的xpwfrun,並賦給當前段落。
解決問題的過程中,「對於removerun方法無法達到本應達成的預期效果的問題」,耗費了不少時間。總結來說:不能從0到size()移除run,這樣的話run不會被移除;而應該從size()到0進行移除。
需要繼續關注**替換時是否會有問題。
解決這類第三方軟體引起的問題,幾乎沒有道理可言,如果不想被埋在相關源**中,只能靠經驗+運氣。
四、附**
在3.10.1下有問題的**示意:
while (itpara.hasnext())
while (length-- > 0)
xwpfrun newrun = paragraph.insertnewrun(0);
newrun.settext(text.replace(tag, val)); }
} 修改後的**示意:
while (itpara.hasnext())
for (int i = (length - 1); i >= 0; i--)
xwpfrun newrun = paragraph.insertnewrun(0);
text = text.replaceall(tag, val);
newrun.settext(text, 0); }
}
poi匯出word模板
poi匯出word模板段落處理 流程 1 讀取文件 獲取docx解析物件 xwpfdocument document newxwpfdocument poixmldocument.openpackage inputurl 在xwpfdocument物件裡有兩個常用的方法,乙個是getparagrap...
word 模板替換 poi tl簡單使用
工作中,需要給word 中的一些標籤替換為 指定的資料 暫時來記錄一下,並且網上找了一些 經典的 poi,itext 等,順便找了幾個比較好用的 嘗試使用了下並記錄下來poi tl 簡介 輕量,主要針對word的模板引擎,提供了對word的豐富操作。官網 其實官網很詳細了,自己就照搬一下吧。pomc...
poi實現word內容替換並且轉pdf和製作模版
請把模版製作好,尤其是下面的解決方法,一定要去修改 請把模版製作好,尤其是下面的解決方法,一定要去修改 重要的問題說三遍!製作模版 file jarf h.getsource jarf.getparent file.separator wordname.tostring 先通過步驟2中的方法獲取到模...