Я использую POI 3.15 на Java, чтобы заменить некоторый текст в моем шаблоне .doc.
private HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) {
Range r = doc.getRange();
for (int i = 0; i < r.numSections(); ++i) {
Section s = r.getSection(i);
for (int j = 0; j < s.numParagraphs(); j++) {
Paragraph p = s.getParagraph(j);
for (int k = 0; k < p.numCharacterRuns(); k++) {
CharacterRun run = p.getCharacterRun(k);
String text = run.text();
if (text.contains(findText)) {
run.replaceText(findText, replaceText);
}
}
}
}
return doc;
}
После сохранения документа. Все содержимое внутри правильное. Но стиль документа - нет. Расстояние между строками изменено. Первоначальный разрыв между строками отсутствует. Все линии плотно упакованы вместе.
Почему? Как сохранить стиль моего шаблона?
Библиотека HWPF может не поддерживать все функции, существующие в вашем файле doc
, и это может привести к изменению форматов. Это также может привести к нечитаемым файлам.
Несколько лет назад я создал специализированную библиотеку HWPF, которая могла корректно модифицировать и записывать широкий спектр файлов документов для одного из моих клиентов, и я приобрел большой опыт работы с форматом файлов документов и библиотекой HWPF.
Проблема в том, что нужно должным образом поддерживать все функции HWPF, которые могут присутствовать в файле doc. Например, если клипарт включен в файл, будут отдельные таблицы, в которых сохраняется положение и свойства клипартов. Если содержание (текст) изменено без корректировки адресов в других внутренних таблицах, форматы и т. д. могут быть смещены, проигнорированы или потеряны. (или в худшем случае документ не читается)
Я не уверен в статусе HWPF в наши дни, но я ожидаю, что он не полностью поддерживает основные функции doc-файла.
Если вы хотите использовать HWPF для изменения/записи файлов документов, вы можете добиться успеха с файлами, которые имеют уменьшенный «набор функций». Например, никаких таблиц, картинок, текстовых полей и тому подобного. Если вам нужно поддерживать практически любой документ, который может предоставить пользователь, я бы порекомендовал найти другое решение.
Одним из вариантов может быть использование файлов rtf
, которые называются .doc
. Или используйте библиотеку XWPF, которая работает с .docx
файлами.
Я думаю, вы правы. Я проверил те же методы с DOCX, и он поддерживает формат и макет.