Apache POI:替换段落文本

时间:2010-08-04 23:21:17

标签: apache ms-word apache-poi

我正在使用Apache POI从模板生成docx文件。似乎没有一种明显的方法来替换段落中的所有文本,文档很少。现在我能够通过循环遍历段落读取文档,然后循环遍历每个段落的运行,然后循环遍历每个运行的文本......这非常有效,我可以在运行中替换文本的内容,但是我的模板占位符(例如:<>)可能会分成几个运行,这使匹配和替换变得非常复杂。有没有办法设置XWPFParagraph的内容?或者至少是一种方法来消除段落中的所有运行并创建自己的运行?

这是我到目前为止所做的:

    public static void main(String[] args) {

    InputStream fs = null;
    try {
        fs = new FileInputStream("C:\\sample1.docx");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    XWPFDocument doc = null;
    try {
        doc = new XWPFDocument(fs);
    } catch (IOException e) {
        e.printStackTrace();
    }

    for (int i = 0; i < doc.getParagraphs().length; i++) {
        XWPFParagraph paragraph = doc.getParagraphs()[i];
        paragraph.getCTP().getRArray().

        // This will output the paragraph's contents.
        System.out.println(paragraph.getParagraphText());

        for (int j = 0; j < paragraph.getCTP().getRArray().length; j++) {
            CTR run = paragraph.getCTP().getRArray()[j];

            for (int k = 0; k < run.getTArray().length; k++) {
                CTText text = run.getTArray()[k];

                // This will output the text contents
                System.out.println(text.getStringValue());

                // And this will set its contents
                text.setStringValue("Success!");
            }
        }
    }

    try {
        doc.write(new FileOutputStream("C:\\output.docx"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:5)

我使用3.7-beta2。解决方案并不理想,有点复杂,但它适用于我的用例。现在有一个XWPFDocument #setParagraph方法可以解决这个问题......我在博客上有几个用POI编写Word文档的例子 - tkgospodinov.com:

http://tkgospodinov.com/writing-microsoft-word-documents-in-java-with-apache-poi/

希望有所帮助。