Создать файл DOCX из файла шаблона в Java
Мне нужно создавать файлы DOCX на основе шаблонов. Шаблон должен содержать заполнители, и я должен быть в состоянии заполнить заполнители из Java . Можно ли это сделать, если это так, предложите мне хороший и эффективный способ сделать это.
4 ответа
Как уже говорилось ранее, есть 3 основных подхода:
ЛУЧШИЙ: привязка данных управления контентом
дешево / весело: переменная замена (т. е. волшебные нити на поверхности документа), но хрупкая (проблема разбивки)
LEGACY: MERGEFIELD с другими полевыми кодами или без них.
Docx4j поддерживает все три подхода, но мы обычно рекомендуем привязку данных для управления контентом, поскольку она соответствует направлению Microsoft (насколько это возможно определить) и является наиболее мощной.
Вы хотите рассмотреть технические навыки авторов вашего шаблона.
Немного опоздал на исходный вопрос, но если кому-то еще нужно динамически создавать документы docx из шаблонов, вы можете взглянуть на библиотеку Java DocxStamper, которую я создал поверх 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();
Вы можете использовать шаблон Word со следующим синтаксисом отчетов LINQ для выполнения ваших требований с помощью Aspose.Words для Java.
<< tag_name [выражение] -switch1 -switch2 ...>>
Тело тега обычно состоит из следующих элементов:
- Имя тега
- Выражение в квадратных скобках
- Набор переключателей, доступных для тега, каждому из которых предшествует символ "-"
Предположим, что у вас есть класс Sender, определенный в вашем приложении следующим образом:
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 в качестве разработчика евангелиста.
См. https://github.com/centic9/poi-mail-merge для простого метода "Переменной замены". Он не работает, если к одной замещающей строке применено несколько форматов, но хорошо работает для простых случаев, когда шаблон тщательно обрабатывается.
По сути, он считывает шаблон и данные из CSV или файла Excel, а затем объединяет их в несколько файлов результатов, по одному для каждой строки данных.
Он работает с содержимым DOCX XML, поэтому не полностью использует поддержку Apache POI XWPF, но при этом форматирование и другие элементы из шаблона используются, как и ожидалось, без необходимости полной поддержки всего в Apache POI (который поддерживает DOCX по-прежнему как часть компонента "блокнота", так как поддержка еще не завершена).