Мне нужно заменить определенный текст в документе 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();
код не выполняет никаких проблем, но он создает разбитое слово файл. Что мне делать?
Извините, я не могу предложить исправление POI, но если вы только начинаете, вы можете рассмотреть другие бесплатные варианты, такие как [JODReports] [1] или [Docmosis] [2]. Они удобны, но имеют большее требование к инфраструктуре, поскольку вам необходимо установить OpenOffice где-нибудь, чтобы помочь конвертировать форматы. [1]: http://jodreports.sourceforge.net/ [2]: http://www.docmosis.com –
Спасибо, но я не могу зависеть от OpenOffice для этого, к сожалению. Docmosis упоминает работу с файлами WinWord, но мне нужен метод замены текста, который я не могу найти в его API. – Amalgovinus
У меня такая же проблема. Даже удалено заменяет. Я просто читаю входной файл с помощью 'HWPFDocument doc = new HWPFDocument (новый POINSFileSystem (новый FileInputStream (путь));' затем записывает 'try (FileOutputStream out = new FileOutputStream (filePath)) { doc.write (out); } '. Но он создает поврежденный файл. – Bagdat