2014-09-10 5 views
0

Я использую этот пример в своем проекте. Все в порядке, и замена текста тоже хороша, но в моем выходном текстовом файле, который должен быть «центрирован», выравниваются влево. Входной файл - .doc, я чувствую, что нарушает форматирование документов, но я не уверен, в чем проблема. Как решить эту проблему?Apache-POI отформатированный текст в файле .doc

public class HWPFTest { 
    public static void main(String[] args){ 
     String filePath = "F:\\Sample.doc"; 
     POIFSFileSystem fs = null;   
     try {    
      fs = new POIFSFileSystem(new FileInputStream(filePath));    
      HWPFDocument doc = new HWPFDocument(fs); 
      doc = replaceText(doc, "$VAR", "MyValue1"); 
      saveWord(filePath, doc); 
     } 
     catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    private static HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText){ 
     Range r1 = doc.getRange(); 

     for (int i = 0; i < r1.numSections(); ++i) { 
      Section s = r1.getSection(i); 
      for (int x = 0; x < s.numParagraphs(); x++) { 
       Paragraph p = s.getParagraph(x); 
       for (int z = 0; z < p.numCharacterRuns(); z++) { 
        CharacterRun run = p.getCharacterRun(z); 
        String text = run.text(); 
        if(text.contains(findText)) { 
         run.replaceText(findText, replaceText); 
        } 
       } 
      } 
     } 
     return doc; 
    } 

    private static void saveWord(String filePath, HWPFDocument doc) throws FileNotFoundException, IOException{ 
     FileOutputStream out = null; 
     try{ 
      out = new FileOutputStream(filePath); 
      doc.write(out); 
     } 
     finally{ 
      out.close(); 
     } 
    } 
} 
+0

Я думаю, вы можете использовать файл docx - разархивировать его, заменить содержимое и zip назад. Я лично делаю это для файлов ods/odt. – user1516873

+1

@ user1516873 Я разработал собственную связанную с docx часть, используя проект POI, прежде чем проект POI получил сцепление с docx. В формате DOCX есть тонкости, где простая замена контента нарушает вещи. Конечно, во многих сценариях это работает, но если нужно быть уверенным, что он работает, то приходится сталкиваться с серьезными дополнительными усилиями. –

+0

@RainerSchwarze Я возьму записку об этом, спасибо. Для формата OpenOffice у меня нет такой проблемы. – user1516873

ответ

2

HWPF не предназначен для записи .doc-файлов. Он может работать для очень простого содержимого файла, но небольшие дополнения его нарушают. Я боюсь, что вам здесь не повезло - если это вариант для вас, вы можете использовать RTF-файлы и работать над ними. Word должен работать правильно, если вы переименуете расширение rtf в .doc (если вам нужно расширение .doc).

(Я разработал пользовательский и рабочий вариант HWPF для клиента и знаю, как там могут быть трудные вещи. В стандартной библиотеке HWPF возникают проблемы, когда существуют символы вне 8-разрядной кодировки, когда используются таблицы, когда текстовые поля используются, когда встроены графики ... Некоторые из них в файлах .doc также отличаются от того, что описано в официальной спецификации Microsoft. Создание рабочей библиотеки HWPF «нетривиально» и требует много spec-reading and research. Если вы хотите пойти по дороге, чтобы исправить эти ошибки, вам нужно ожидать, по крайней мере, полгода усилий разработчиков.)

+0

Спасибо за подробное описание проблемы. – Alex85

+0

Да, я использую много таблиц и логотипов, проблема решена, я сохраняю файл в формате .odt и использую JODReports. Весь текст форматирования в выходном файле - хорошо. – Alex85

Смежные вопросы