使用Apache POI更新Microsoft Word 2007 / xml .docx文件会附加文本而不是替换?

时间:2011-09-16 11:21:44

标签: java apache-poi

我有一个Microsoft Word 2007 / xml .docx文件,我尝试使用Apache POI 3.8beta4进行编辑。除其他外,该文档包含一个表,该表包含以$ {place.holder}形式保存占位符的单元格,我需要替换它。到目前为止我得到的是什么;

    InputStream resourceAsStream =  getClass().getResourceAsStream("/path/to/templates/rma.docx");       
    try {
        XWPFDocument xwpfdoc = new XWPFDocument(resourceAsStream); 

        FileOutputStream fos = new FileOutputStream(new File("C:\\temp\\newTemplate.docx"));

        for (XWPFTable table : xwpfdoc.getTables()) {

             for (XWPFTableRow row : table.getRows()) {

                 for (XWPFTableCell cell : row.getTableCells()) {

                     String data = cell.getText();

                     if (data.contains("${rma.number}")) {
                         cell.setText("08739");
                     }

                     if (data.contains("${customer.name}")) {
                         cell.setText("Roger Swann");
                     }
                 }
             }
        }
        xwpfdoc.write(fos);
        fos.flush();
        fos.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    } 

问题是cell.setText(“替换文本”}附加到已经存在的字符串数据而不是替换它,所以我在完成的文档中最终得到的是字符串“{place.holder}替换文本“。

如何替换文本而不是附加到文本?

此致

2 个答案:

答案 0 :(得分:1)

快速解决方法是获取单元格的基础文本,并更改​​它。它有点繁琐,但可以做到。您可能想要调用cell.getBodyElements()并迭代它们以找到包含您文本的内容。然后,更改其中的文本,而不是尝试直接更改单元格

较长期的一个是在POI bugzilla中打开一个新的bug,并上传一个失败的单元测试。这应该包括您的文件,并显示文本的“替换”,然后保存,重新加载和阅读。之后可以修复该问题

答案 1 :(得分:1)

cell.removeParagraph(0);
cell.setText(entrada.getValue());