Java Apache POI добавляет новую строку в существующую таблицу. Word документ

Я пытаюсь добавить новую строку в существующую таблицу в документе MS Word. Я использую POI 3.10, библиотеку hwpf. Но после выполнения этой программы файл вылетает, в MS Word выдается предупреждение. Весь контент выглядит странно и не отформатирован.

Образец ниже:

InputStream fin = new FileInputStream(args[0]);
    POIFSFileSystem fs = new POIFSFileSystem(fin);

    HWPFDocument doc = new HWPFDocument(fs);
    Range range = doc.getRange();

    range.getParagraph(269).insertAfter("TEST");
    doc.write(new FileOutputStream("SOME PATH"));

Может быть, нужно обновить что-то дополнительное (например, SI, DSI), потому что добавлен новый CharacterRun?

1 ответ

Файлы DOC в формате Word97/2000 поддерживаются только в простых вариантах HWPF. Таблицы уже критичны. Если Word отклоняет файл, который вы создали / изменили с помощью библиотеки, вам, вероятно, не повезло.

Я разработал пользовательскую библиотеку на основе кодовой базы HWPF Apache некоторое время назад для клиента. Эта пользовательская библиотека добавила поддержку многих функций и могла надежно записывать файлы Word. Делать все это правильно было много работы. Так что просто починить мелочи невозможно. Тебе придется потратить несколько человеко-месяцев.

Будет ли возможность создать пустые строки в Word и просто заполнить их HWPF?

РЕДАКТИРОВАТЬ: Вероятно, функциональная работа вокруг:

Предварительно заполните таблицу маркерами:

+--------+-------------+------------------------------------+
| Rev 1  |  2014-01-01 | Created document                   |
+--------+-------------+------------------------------------+
| Rev 2  |  2014-01-02 | Corrected flow chart               |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+
| $REVMRK|  $REVDATE## | $REVTEXT########################## |
+--------+-------------+------------------------------------+

Убедитесь, что маркеры достаточно длинные. (Добавление текста в HWPF, чтобы адреса абзацев изменялись в таблицах, может вызвать проблемы.)

Чтобы заполнить строку, сделайте это:

  1. Найдите набор маркеров для одного ряда
  2. Каждый маркер должен включать все последующие # -характеры
  3. Подготовьте текст для каждого маркера
  4. Убедитесь, что ваш текст использует только символы ASCII (см. Ниже)
  5. Убедитесь, что ваш текст не длиннее маркеров ревизий
  6. Заполните метки ревизий новым содержимым и заполните оставшиеся # -символы пробелами

Если программное обеспечение не находит новую строку, кто-то должен добавить новые шаблоны строк в Word.

Причина некоторых ограничений:

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

Диапазон ASCII: последовательности текста хранятся в виде 1 байта на символ или 2 байта на символ. Если вы делаете это правильно, вставка не-ASCII символа в 1-байтовый диапазон требует преобразования этого диапазона в 2-байтовый диапазон. Это не всегда хорошо работает в HWPF и приводит к смещению адреса (см. "Без вставки" выше).

Вы можете обойтись без некоторых ограничений, если ваш документ "проще". Например: нет текстовых полей лучше. Нет встроенных рисунков лучше. Нет вложенных таблиц лучше. Однако, как правило, ограничения настолько строги, что вы также можете использовать простой текстовый документ и дать ему расширение.doc.

Дайте мне знать, если вам нужно больше деталей.

Другие вопросы по тегам