Создать файл DOCX из файла шаблона в Java

Мне нужно создавать файлы DOCX на основе шаблонов. Шаблон должен содержать заполнители, и я должен быть в состоянии заполнить заполнители из Java . Можно ли это сделать, если это так, предложите мне хороший и эффективный способ сделать это.

4 ответа

Решение

Как уже говорилось ранее, есть 3 основных подхода:

  1. ЛУЧШИЙ: привязка данных управления контентом

  2. дешево / весело: переменная замена (т. е. волшебные нити на поверхности документа), но хрупкая (проблема разбивки)

  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 по-прежнему как часть компонента "блокнота", так как поддержка еще не завершена).

Другие вопросы по тегам