开发者社区> 问答> 正文

用java POI 替换word2007 中的部分内容,一直替换不了?报错

我想用POI 替换word2007 中的:<%8000011%>  变成:AAAAA

XWPFDocument document=new XWPFDocument(POIXMLDocument.openPackage("C:\\Users\\whx\\Desktop\\whx.docx"));
   Iterator<XWPFParagraph> itPara =document.getParagraphsIterator();
   while(itPara.hasNext()){
    XWPFParagraph paragraph =itPara.next();
    List<XWPFRun> runs=paragraph.getRuns();
    for(int i = 0; i < runs.size(); i++){
     XWPFRun run=runs.get(i);
     String oneParagString = runs.get(i).getText(runs.get(i).getTextPosition()); 
     String oneParagString=run.getText(0);
     if(oneParagString!=null){
      for(Map.Entry<String, String> entry:map.entrySet()){
       if(oneParagString!=null&&oneParagString.contains(entry.getKey())){
        oneParagString=oneParagString.replace(entry.getKey(), entry.getValue());
       }
      }
      run.setText(oneParagString, 0);
     }
    }
   }

如果我用上面加粗的第一行代码:报错 数组下标越界

String oneParagString = runs.get(i).getText(runs.get(i).getTextPosition());

Exception in thread "main" java.lang.IndexOutOfBoundsException
 at org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTRImpl.getTArray(Unknown Source)
 at org.apache.poi.xwpf.usermodel.XWPFRun.getText(XWPFRun.java:281)
 at com.axjy.entity.Test2.main(Test2.java:41)

如果我用上面加粗的第二行代码的话:

String oneParagString=run.getText(0);

在控制台打印出来的oneParagString 的内容格式会改变

比如:word文档中的内容:  您好,<%8000011%>,欢迎您!  本来在一行的,展示出来的却是换行后的数据。

您好,

<%

8000011

%>,

欢迎您!

这样的话,根本找不到<%8000011%> ,所以就替换不成功。

请问一下:那个高手知道 上面两个方法的区别是什么?

用第一个方法,报错的原因是什么?

用第二个方法的话,为什么打印的内容自动换行?









展开
收起
爱吃鱼的程序员 2020-06-09 16:16:40 754 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
    document.getRange().replace 可以替换,但是这样的话,不会保存word的格式。最后得到的是一个纯文本的word,以前word中的标题,字体大小,颜色,都会消失的。

    我只是想替换原来word中的部分内容,其他的标题,字体,格式都不能改变的。

    还有别的方法么?

    急等高手指点。我的qq号1247726124, 现在卡在这里了。一直动不了了。路过的各位大神,指点一量句话把。。。。。。。。。

    word中选中表达式,设置为宋体试试

    xdoc做类似的功能,可以关注一下: http://www.xdocin.com/cmyg.xdoc?_format=docx

    好像不行啊。这样的话,还是那样自动换行。<%80000011%>现在主要是run.getText(0);和run.getText(run.getTextPosiong());这两个方法那个是正确的?run.getText(0);这个方法对吗?

    各位大神,有没有别的方法可以替换word2007 。docx文件的插件?

    告诉我一下;让我也学习一下。

    可以的话,我想用别的方法,来试试。

    如果是docx,你要暴力一点,直接用zip打开文件找到document.xml,然后直接啪啦啪啦的把里面的转换,当然我就说说,因为他的run和里面内容是分开的话就没办法匹配到你说的这个内容。因为会涉及到文字style问题,所以其实你这样解析真心不是很好做。反正我是没有想到一个很块的版办法就是了。如果我会做可能也和你差不多,首先解析所有paragraph,拿出里面所有的run(paragraph下的内容也分为很多种啊hyperlink也是run的内容),然后慢慢判断,没用过POI,对其不是非常了解,只是知道Word07的XML文件结构。试试合并run有创意。我试试看。谢谢拉。。。

    请问一下。有没有方法可以在XWPFParagraphparagraph=itPara.next();

    后面替换呢?因为我打印出来的paragraph.toString();中的<%8000011%>是没有换行的。

    2020-06-09 16:16:57
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载