2013-02-05 1 views
3

У меня есть шаблон документа, в котором некоторые поля являются статическими, а другие - динамическими. Мне нужно заменить некоторые данные (имя, фамилию, зарплату) и сгенерировать новый файл. В какой библиотеке вы рекомендуете это делать? Соответствует ли POI? Я работаю с Spring, Java EE6 и Oracle.Как создать документ Word из шаблона или существующего документа с помощью Java?

+0

Посмотрите на этот вопрос: http://stackoverflow.com/questions/10005678/learning-apache-poi –

ответ

3

Вы можете дать Apache POI попробовать, но часть HWPF и XWPF POI, которые необходимы для управления текстовыми файлами, действительно сложны в использовании - вам нужно иметь хотя бы хорошее понимание того, как структурирован текстовый файл!

Решение с использованием IText и PDF

я что-то подобное с PDF (это может быть одним из вариантов для вас)

1) Вы можете использовать LibreOffice для создания полей в документе (например, в Acrobat Pro)

  • Создать .odt файл и стиль его
  • или преобразовать шаблон к нему с помощью MS Word или LibreOffice Writer
  • Затем выберите Вид -> Toolsbars -> Дизайн формы и установить «режим Design вкл/выкл»
  • Теперь вы можете добавлять поля в файл (дважды щелкнув по нему откроется свойства полей)
  • Когда ты по окончании: "Файл -> Экспорт в PDF"

2) Теперь вы можете использовать IText для заполнения созданных полей

ниже приведен только пример кода:

public byte[] getDocumentAsByteArray(Object dataBean, String pdfTemplateName) throws KkmsException { 

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    PdfStamper stamp = null; 
    InputStream templateInputStream = null; 

    Locale local = new Locale(language); 

    try { 
     templateInputStream = // get the file input stream of the pdf 
     PdfReader reader = new PdfReader(templateInputStream); 

     // Create a stamper that will copy the document to a new file 
     stamp = new PdfStamper(reader, outputStream); 

     AcroFields form = stamp.getAcroFields(); 

     // form fields are normal text in the end 
     stamp.setFormFlattening(true); 
     Map<String, AcroFields.Item> map = (Map<String, AcroFields.Item>)form.getFields(); 
     if (map != null) { 
      if (map.size() == 0) { 
       logger.debug("There are no fields in this PDF layout"); 
      } 
      for (Entry<String, AcroFields.Item> e : map.entrySet()) { 
       logger.debug("PDF fieldname = " + e.getKey()); 

       // at the moment we only handle text fields 
       if (AcroFields.FIELD_TYPE_TEXT == form.getFieldType(e.getKey())) { 
        fillForm(dataBean, form, e.getKey(), local); 
       } else { 
        logger.warn("Field type is not supported: "+form.getFieldType(e.getKey())); 
       } 
      } 
     } 

     stamp.close(); 
    } catch (Exception e) { 
     logger.warn("Failed to create PDF document", e); 
     throw new KkmsException("Failed to create PDF document: "+e.getMessage()); 
    } finally { 
     if (templateInputStream != null) { 
      try { 
       templateInputStream.close(); 
      } catch (IOException e) { 
       throw new KkmsException("Failed to close InputStream of PDF document", e); 
      } 
     } 
    } 
    return outputStream.toByteArray(); 
} 

В конце вы получаете PDF -> надеюсь, это поможет вам хотя бы немного!

Другой быстрый и грязный раствор

Может быть использовать силу а.с. или DOCX -> конвертировать ваш документ в DOCX или ODT -> его просто почтовый файл -> так распаковать его -> вы будете увидеть файл content.xml в корне молнии -> есть все содержимое документа там Теперь вы можете добавить некоторые магические метки (например, $$$) здесь, которые в дальнейшем могут быть заменены на вашей программе

<text:p text:style-name="P3">SAP Customer Number:</text:p> 

<text:p text:style-name="P3">SAP Customer Number: $$$sapCustomerNumber$$$</text:p> 

Теперь создайте программу, которая распаковывает файл odt/docx -> заменяет теги -> снова застегивает файл

2

These slides, из презентации, которую я дал в OSDC 2012, изложены основные подходы.

В наши дни я, скорее всего, добавлю «генерировать то, что вы хотите, как XHTML, а затем экспортируете его в docx». Поскольку мы ввели docx4j-ImportXHTML с поддержкой преобразования значений CSS @class в стили Word, мы все чаще видели этот подход.