Apache POI replaceText () побочный эффект, изменяет пространство строки - PullRequest
0 голосов
/ 28 мая 2019

Я использую 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;
}

После сохранения документа.Все содержимое внутри правильно.Но стиль документа не так.Пространство между строками изменено.Оригинальный разрыв между строками отсутствует.Вся линия тесно упакована вместе.

Почему?Как мне сохранить стиль моего шаблона?

1 Ответ

2 голосов
/ 28 мая 2019

Библиотека HWPF может не поддерживать все функции, которые существуют в вашем файле doc, и это может привести к изменению форматов.Это также может привести к нечитаемым файлам.

Несколько лет назад я создал настраиваемую библиотеку HWPF, которая могла бы правильно изменять и записывать разнообразные файлы документов для одного из моих клиентов, и я приобрел большой опыт работы сформат файла doc и библиотека HWPF.

Проблема в том, что нужно должным образом поддерживать все функции HWPF, которые могут присутствовать в файле doc.Например, если клипарт включен в файл, будут отдельные таблицы, которые сохраняют положение и свойства клипартов.Если содержимое (текст) изменяется без корректировки адресов в других внутренних таблицах, форматы и т. Д. Могут быть сдвинуты, проигнорированы или потеряны.(или в худшем случае документ не читается)

В настоящее время я не уверен в статусе HWPF, но я ожидаю, что он не полностью поддерживает основные функции, относящиеся к файлу документации.

Если вы хотите использовать HWPF для изменения / записи файлов документов, вы можете добиться успеха с файлами, которые имеют сокращенный «набор функций».Например, нет таблиц, нет клипартов, нет текстовых полей - все в таком духе.Если вам требуется поддержка практически любого документа, который может предоставить пользователь, я бы порекомендовал найти другое решение.

Одним из вариантов может быть использование rtf файлов с именем .doc.Или используйте библиотеку XWPF, которая работает для .docx файлов.

...