При обновлении файла Microsoft Word 2007 / xml .docx с помощью Apache POI текст добавляется, а не заменяется? - PullRequest
4 голосов
/ 16 сентября 2011

У меня есть файл 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 ]

1 голос
/ 22 февраля 2012
cell.removeParagraph(0);
cell.setText(entrada.getValue());
1 голос
/ 16 сентября 2011

Быстрое решение состоит в том, чтобы получить базовый текстовый прогон ячейки и изменить его. Это немного неудобно, но это может быть сделано. Вы, вероятно, захотите позвонить cell.getBodyElements() и выполнить итерацию по ним, чтобы найти объект с вашим текстом. Затем измените текст, а не пытайтесь изменить ячейку напрямую

Более долгосрочным является открытие новой ошибки в bugzilla POI и загрузка неудачного модульного теста. Вероятно, он должен включать ваш файл и показывать «замену» текста с последующим сохранением, перезагрузкой и чтением. Проблема может быть позже исправлена ​​

...