2010-01-02 3 views
7

Я хотел бы создать текстовый документ с использованием шаблона, заменить некоторые переменные (поля) и сохранить его как новый документ слова.API-интерфейс создания документа Word в Java

Я думал, используя Apache POI, http://poi.apache.org/ Он лучший для этой цели? Вы можете поделиться своим мнением?

+4

Проверьте здесь: http://stackoverflow.com/questions/203174/whats-a-good-java-api-for-creating-word-documents – JCasso

ответ

8

Я работал с POI раньше, и он, безусловно, может сгенерировать документы Word. Но дьявол в деталях.

Word имеет тысячи функций: вы можете помещать нумерованные списки, начиная с № 13, с отрицательными отступами в две сочлененные ячейки таблицы, включенной в другую таблицу, которая сама является частью списка маркеров ... вы получаете эту идею. Когда в документации POI говорится, что они находятся в процессе разработки, это отражает то, что, вероятно, будет вечным состоянием в попытке догнать (для нас, недокументированную) спецификацию Word.

Документы с разумно «нормальным» набором используемых функций хорошо поддерживаются POI, интерфейсы и методы которого разумны и последовательны, но иногда требуют небольшой работы. Но, как говорит Паскаль, документы с не слишком непостоянным набором функций также поддерживаются RTF. У меня почти нет опыта «делать» RTF, но это, наверное, немного проще, чем работать с POI.

Если вы работаете в среде или для клиента, который настаивает на том, чтобы ваши подготовленные документы были .DOC, а не .RTF, тогда POI - это ваш единственный выбор, если вы не можете ввести шаг, в котором вы используете немного Office автоматизация для преобразования RTF в DOC.

Обновление: У меня было еще несколько идей за это время.

Использование POI или создание документов RTF - это то, что вы могли бы сделать практически на любой платформе. Например, на моей работе все серверы, выполняющие такую ​​обработку, работают под управлением Linux.

Однако в вероятном случае, что ваши программы будут работать под Windows, есть еще одна альтернатива: Jacobhttp://www.land-of-kain.de/docs/jacob/

Джейкоб COM интерфейс для Java; он по существу позволяет вам «дистанционно управлять» программами Windows, такими как Word и Excel. Документ, который я связал выше, не относится к собственному сайту Джейкоба, а к одной странице с рецептами куки-резака для использования Jacob. Сам проект находится на SourceForge: http://sourceforge.net/projects/jacob-project/ Но люди утверждают, и это правильно, что документации немного не хватает.

У Джейкоба есть преимущество перед всеми другими решениями, которые вы имеете дело с «настоящим» Словом, и поэтому все возможности доступны для Word. Это было бы альтернативой, если бы были детализированные аспекты вашего документа, которые просто невозможно обработать с помощью POI или через формат RTF.

2

Я не уверен в точном статусе поддержки документов Word в POI, но, согласно веб-сайту POI, работа все еще продолжается (не могу сказать, что это означает точно). Итак, в это время я бы не использовал POI, а попытался создать RTF-документ. Для этого, вы можете:

  • Использование RTFTemplate, который является RTF в формате RTF Engine, который может генерировать RTF документ в результате слияния модели RTF и данных.
  • Используйте iText, который является вначале PDF-генератором, но может также generate RTF.
  • Создайте собственное решение (но я бы этого не сделал).

Я бы выбрал iText.

3

Если вы используете шаблон и не хотите создавать документ с нуля, для чего я знаю, POI - довольно хорошее решение. Вы открываете шаблон и выбираете зоны, которые хотите заменить.

Говорят, что POI по-прежнему развивается, но я использую его в производственной среде, и он работает очень хорошо на данный момент.

+0

Полезно знать. Благодарю. –

+0

Проблема У меня есть: мое слово Шаблон ** имеет заголовок, который нужно отредактировать **. И насколько я знаю, POI не позволяет мне редактировать заголовок. –

+0

@ Valentin Rocher, у вас не возникало проблем с этим методом, например, это не работало все время – fatiDev

1

Вы должны изучить компоненты Aspose.Words. Недавно они начали предоставлять Java-версию компонента.

Смотрите следующую ссылку: Aspose.Word for Java

Это поддерживает автоматизацию Word, создание и расширенные функции, такие как слияние почты без необходимости экземпляр Microsoft Word на компьютере. Реальные преимущества заключаются в том, что вы можете работать в контексте реального документа с текстом и не нуждаться в компрометации, создавая RTF и т. Д.

Версия Java в настоящее время не так полно, как версия .Net, но основная ядро функциональность есть, и они очень сильно продвигаются, чтобы вскоре получить эквивалентную версию.

Кроме того, если вы приобрели версию Java, вы получаете бесплатные обновления/поддержку по годам при создании новых выпусков.

1

Если вы работаете с документами docx, docx4j является опцией. Как POI, его открытый источник.

2

Я знаю, что этот вопрос немного старый, но я думаю, что многие люди до сих пор находят это с поисковыми системами, поэтому я выкладываю еще одну возможность делать то, что вы хотите здесь:

Если единственная цель состоит в том, чтобы иметь шаблон Word и заменить некоторые значения в нем, вы можете подумать о сохранении шаблона Word как одного xml (а не docx), а затем обработать его простой Java и без какой-либо Framework. Если вы хотите сделать больше (например, создавать списки или таблицы), вы также можете подумать о понимании формата xml и написать свои собственные помощники перед загрузкой Framework, такого как POI.

Вот пример того, как сделать это: http://dev-notes.com/code.php?q=10

Это быстрая версия, если вы хотите хороший вариант, вы можете попробовать использовать процессор XML.

PS: пользователи могут заметить, что расширение файла не doc, а xml, и они могут обвинить вас в этом, но это нормально ... просто переименуйте его в doc, слово распознает формат, и все снова счастливы;)

4

Это, очевидно, слишком поздно, но с 2013 года существует намного лучшее, более гибкое решение для создания документа Word.

http://www.docx4java.org/trac/docx4j

У меня было гораздо больше повезло с docx4j, чем я когда-либо делал с POI.