Apache POI: заменить текст абзаца - PullRequest
2 голосов
/ 05 августа 2010

Я использую 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 Ответ

5 голосов
/ 03 сентября 2010

У меня это работает с 3.7-бета2.Решение не идеальное и немного запутанное, но оно сработало для моего варианта использования.Теперь есть метод XWPFDocument # setParagraph, который сделает свое дело ... У меня есть несколько примеров написания документов Word с POI в моем блоге - tkgospodinov.com:

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

Надеюсь, это поможет.

...