Мне нужно создать файлы docx на основе шаблонов. Шаблон должен содержать держателей мест, и я должен иметь возможность заполнить держатели мест из java. Можно ли это сделать, если да, то предложите мне хороший и эффективный способ сделать это.Создайте файл docx из файла шаблона в java
ответ
Как уже обсуждался в других местах до, есть 3 основных подхода:
ЛУЧШИЕ: данные контроля содержания связывания
дешево/весел: Переменная замена (т.е. магические строки на поверхности документа), но хрупкий (проблема с раздельным прогоном)
LEGACY: MERGEFIELD с другими кодами полей или без них.
docx4j поддерживает все три подхода, но в целом мы рекомендуем содержание управления привязки данных, так как она совпадала с направлением Microsoft (как лучше всего может быть установлено), и является самым мощным.
Вы должны учесть технические навыки авторов шаблонов.
См. https://github.com/centic9/poi-mail-merge для простого метода замены переменных. Он не работает, если в одной заменяющей строке применено несколько форматов, но хорошо работает для простых случаев, когда шаблон тщательно обрабатывается.
В основном он считывает шаблон и данные из CSV или файла Excel, а затем объединяет его в несколько файлов результатов, по одному для каждой строки данных.
Он работает с XML-контентом DOCX, поэтому он не полностью использует поддержку Apache POI XWPF, но таким образом форматирование и другие элементы из шаблона используются, как ожидается, без необходимости полной поддержки всего в Apache POI (который имеет Поддержка DOCX по-прежнему входит в состав компонента «блокнот», поскольку поддержка пока не считается полностью выполненной).
Вы можете использовать шаблон Word со следующим синтаксисом LINQ Reporting для достижения ваших требований с помощью Aspose.Words для Java.
< < tag_name [выражение] -switch1 -switch2 ... >>
Тело тега, как правило, состоит из следующих элементов:
- Имя тега
- выражение в скобки
- Набор переключателей для тега, каждому из которых предшествует символ «-»
Предположим, что у вас есть класс отправителя, определенный в приложении следующим образом:
public class Sender {
public Sender(String name, String message) {
_name = name;
_message = message;
}
public String getName() {
return _name;
}
public String getMessage() {
return _message;
}
private String _name;
private String _message;
}
Чтобы подготовить доклад, содержащий сообщение о конкретном отправителе от его имени, вы можете использовать шаблон документа со следующим содержимым ,
< < [s.getName()] >> говорит: «< < [s.getMessage()] >>."
Для построения отчета из шаблона, вы можете использовать следующий исходный код.
Document doc = new Document(getMyDir() + "temp_HelloWorld.docx");
Sender sender = new Sender("LINQ Reporting Engine", "Hello World");
ReportingEngine engine = new ReportingEngine();
engine.buildReport(doc, sender, "s");
doc.save(getMyDir() + "out.docx");
Я работаю с Aspose, как евангелист Developer.
немного опоздал на оригинальный вопрос, но если кто-то еще нужно динамически создавать DOCX документы из шаблонов, вы можете захотеть взглянуть на DocxStamper Java библиотеки, которые я создал на вершине docx4j.
Это позволяет использовать Spring Expression Language в шаблонах docx, и вы можете создать документ из шаблона с такими парами строк:
MyData data = ...; // your own POJO containing the data
InputStream template = ...; // InputStream to the template file
OutputStream out = ...; // OutputStream to the resulting document
DocxStamper stamper = new DocxStamperConfiguration()
.build();
stamper.stamp(template, context, out);
out.close();