Замените текст, используя Apache POI в верхнем / нижнем колонтитуле, если точка не находится внутри заполнителя - PullRequest
0 голосов
/ 28 мая 2019

Я использую POI templ4docx / Apache (2.0.3 / 3.17).Там вы можете установить VariablePatten следующим образом:

private static final String START_PATTERN = "#{";
private static final String END_PATTERN = "}";
...
targetDocx.setVariablePattern(new VariablePattern(START_PATTERN, END_PATTERN));

Когда я использую заполнитель с точками, он не работает внутри верхнего / нижнего колонтитула.В теле с точками это работает.И Изображения тоже работают с заполнителями и точками внутри!

Example in Word-Template:
#{Person.Name} // works in Body NOT in Header/Footer!
#{Person.Name} // works in Body and Header/Footer!
#{Person} // works in Body and Header/Footer!
#{Image.Name} // works in Body and Header/Footer! Here i use ImageVariable instead of Textvariable.

Я отлаживаю код и вижу, что "run.setText ()" вызывается с правильным текстом, но в конечном документе это не так.

@Override
public void insert(Insert insert, Variable variable) {
    if (!(insert instanceof TextInsert)) {
        return;
    }
    if (!(variable instanceof TextVariable)) {
        return;
    }

    TextInsert textInsert = (TextInsert) insert;
    TextVariable textVariable = (TextVariable) variable;
    for (XWPFRun run : textInsert.getParagraph().getRuns()) {
        String text = run.getText(0);
        if (StringUtils.contains(text, textInsert.getKey().getKey())) {
            text = StringUtils.replace(text, textVariable.getKey(), textVariable.getValue());
            if (text.contains("\n")) {
                String[] textLines = text.split("\n");
                run.setText(textLines[0], 0);
                for (int i = 1; i < textLines.length; i++) {
                    run.addBreak();
                    run.setText(textLines[i]);
                }
            } else {
                run.setText(text, 0);
            }
        }
    }
}

Есть идеи, почему он не работал с заполнителем "# {Person.Name}" как TextVariable в верхнем / нижнем колонтитуле?Но это работает с "# {PersonName}" и ImageVariable "# {Images.Logo1}" ???

1 Ответ

0 голосов
/ 17 июня 2019

Похоже, что Word иногда разделяет заполнители, поэтому вы можете найти только части заполнителя в прогонах.

В классе "TextInsertStrategy" я проверяю цикл прогонов для разделенных заполнителей и обрабатываю его соответствующим образом. С этим я мог решить проблему.

...