2010-08-02 2 views
1

Мне нужно заменить определенный текст в документе WinWord. Проблема в том, что любая замена текста, которую я делаю на Range с функцией replaceText, создает сломанный файл WinWord, если только заменяемые и замененные строки не имеют одинаковой длины. Мы будем иметь дело с динамическим контентом, поэтому этого не будет.Замена текста в документе WinWord с использованием Apache POI

объект Range функции: http://poi.apache.org/apidocs/org/apache/poi/hwpf/usermodel/Range.html#replaceText(java.lang.String, java.lang.String)

Функция ReplaceText имеет необязательный третий параметр, в INT, чтобы указать какое-то смещение. Я подумал, что это может быть решение, но параметр не может даже обрабатывать отрицательное значение, что делает его трудным или невозможным сделать замену, если смещение (replacement.length() - replacement.length()) не будет положительным. Однако мне может потребоваться, чтобы он был отрицательным. Во всяком случае, ничто в документах не показало бы, что этот параметр offset необходим, если два других параметра не равны.

Вот мой код: (скажем, A.doc содержит только «caaaaaaake»)

 String inputFilename = "C:\\\a.doc"; 

     String outputFilename = "C:\\b.doc"; 
     POIFSFileSystem fs = null; 
     FileInputStream fis = new FileInputStream(inputFilename); 
     fs = new POIFSFileSystem(fis); 

     HWPFDocument doc = new HWPFDocument(fs); 

     Range range = doc.getRange(); 
     range.replaceText("caaaaaaake", "piiiie"); 


     FileOutputStream fos = new FileOutputStream(outputFilename); 
     doc.write(fos); 

     fis.close(); 
     fos.close(); 

код не выполняет никаких проблем, но он создает разбитое слово файл. Что мне делать?

+0

Извините, я не могу предложить исправление POI, но если вы только начинаете, вы можете рассмотреть другие бесплатные варианты, такие как [JODReports] [1] или [Docmosis] [2]. Они удобны, но имеют большее требование к инфраструктуре, поскольку вам необходимо установить OpenOffice где-нибудь, чтобы помочь конвертировать форматы. [1]: http://jodreports.sourceforge.net/ [2]: http://www.docmosis.com –

+0

Спасибо, но я не могу зависеть от OpenOffice для этого, к сожалению. Docmosis упоминает работу с файлами WinWord, но мне нужен метод замены текста, который я не могу найти в его API. – Amalgovinus

+0

У меня такая же проблема. Даже удалено заменяет. Я просто читаю входной файл с помощью 'HWPFDocument doc = new HWPFDocument (новый POINSFileSystem (новый FileInputStream (путь));' затем записывает 'try (FileOutputStream out = new FileOutputStream (filePath)) { doc.write (out); } '. Но он создает поврежденный файл. – Bagdat

ответ

1

Я считаю, что когда вы доберетесь до версии 3.8, эта проблема решена. При работе с бета5 этот код работает для меня. Сгенерированный файл слова можно открыть с помощью piiiie в файле, где ваш caaaaaaake был

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