POI 处理word 文档中 文本框模板
最近處理word模板中發(fā)現(xiàn)存在文本框類型的模板,以前從未處理過只能百度一下了,結(jié)果大部分出現(xiàn)的都是https://jingyan.baidu.com/article/e4d08ffdd352690fd2f60d8b.html 這種情況的,大多數(shù)針對的都是固定的文檔格式,感覺很難弄明白,官網(wǎng)也直指大概提了一下,并沒有明顯的demo,不過從側(cè)面來講倒是提供了解決的辦法,只能靠自己了,首先需要處理的模板后綴名稱改成rar格式,本身word就是一堆xml的集合,在解壓之后找到對應(yīng)的document.xml,這個就是對應(yīng)的整個文檔結(jié)構(gòu)了,慢慢遍歷自己的節(jié)點,找打需要修改的地方,一層一層的去尋找,然后移動對應(yīng)的XmlCursor到制定位置,去尋找,整個過程很浪費耐心,所以處理之前一定要格式化好的xml,網(wǎng)上有在線的工具,我只是把自己處理的過程分享一下,因為我是替換的文本,所以結(jié)構(gòu)先列出來
??? public static List<String>patternList=new ArrayList();
?? ?//需要處理的節(jié)點名稱
?? ? static {?? ?
?? ??? ? patternList.add("mc:AlternateContent");
?? ??? ?patternList.add("mc:Choice");
?? ??? ?patternList.add("w:drawing");
?? ??? ? patternList.add("wp:anchor");
?? ??? ?patternList.add("a:graphic");
?? ??? ?patternList.add("a:graphicData");
?? ??? ?patternList.add("wps:wsp");
?? ??? ? patternList.add("wps:txbx");
?? ??? ? patternList.add("w:txbxContent");
?? ??? ? patternList.add("w:p");
?? ??? ? patternList.add("w:r");
?? ??? ?patternList.add("w:t");?? ?
?? ?}
里面包含每一需要處理的節(jié)點的名稱,然后就是進行回朔找到patternList中最后一個元素位置,也就是w:t的位置,當(dāng)XmlCursor光標(biāo)移動到對應(yīng)的位置就可以執(zhí)行正常的替換工作,
詳細代碼如下
??? public static void changeTextBox( XWPFDocument document,Map<String, String>map) {
?? ??? ?
?? ??? ?
?? ??? ?for(XWPFParagraph paragraph:document.getParagraphs())
?? ??? ??? ?for(XmlObject object:paragraph.getCTP().getRArray())
?? ??? ?{
???? XmlCursor cursor = object.newCursor();
???? eachchild(cursor, 0,map);
?? ??? ?}
??? }
//回朔查找,因為并不是每一個文本框中只有一個可替換的地方
??? public static void eachchild(XmlCursor cursor,int start,Map<String, String>map) {
//預(yù)計子節(jié)點個數(shù)應(yīng)該是小于10個節(jié)點
?? ??? ?for(int i=0;i<10;i++)
?? ??? ?{
//如果可以移動到子節(jié)點i
?? ??? ??? ?if(cursor.toChild(i)) {
????????? //如果移動到達的子節(jié)點正好是按照順序是需要的節(jié)點 則繼續(xù)前往下一層
?? ??? ??? ?if(cursor.getDomNode().getNodeName().equals(patternList.get(start))) {
?? ??? ??? ??? ?if(start==patternList.size()-1) {
?? ??? ??? ??? ??? ?String reString=cursor.getTextValue();
?? ??? ??? ??? ??? ?for(String e:map.keySet()) {
?? ??? ??? ??? ??? ??? ?if(reString.contains(e)) {
?? ??? ??? ??? ??? ??? ?//??? 執(zhí)行替換
?? ??? ??? ??? ??? ??? ??? ?reString=reString.replaceAll(e, map.get(e));
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
????? //bingo? 設(shè)置替換節(jié)點內(nèi)容
?? ??? ??? ??? ??? ?cursor.setTextValue(reString);
?? ??? ??? ??? ?}
?? //繼續(xù)下一層? 遍歷
?? ??? ??? ??? ?eachchild(cursor,start+1,map);
?? ??? ??? ?}else {
?? ??? ??? ??? ?cursor.toParent();
?? ??? ??? ?}
?? ??? ?}
?? ??? ?}
//? 此處很重要,如果命中或者未命中都需要 遍歷其他節(jié)點
?? ??? ?cursor.toParent();
??? }
PS:整個代碼就是這個樣子了,其他的自行補充完整,圖片這一塊懶得去處理了,只是提供一個大概的解決思路。提供的信息不多,相信你搜索到這篇文章的時候,很多預(yù)備知識都已經(jīng)知道了,我就不再累述。如有問題請私信聯(lián)系,當(dāng)然更期待有心人能夠補充的更加詳細更加完整。轉(zhuǎn)載注明出處,謝謝!
總結(jié)
以上是生活随笔為你收集整理的POI 处理word 文档中 文本框模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv19:轮廓凸包,距离与匹配
- 下一篇: Helper辅助类设计技巧