Я использую 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}" ???