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, чтобы адреса абзацев изменялись в таблицах, может вызвать проблемы.)
Чтобы заполнить строку, сделайте это:
- Найдите набор маркеров для одного ряда
- Каждый маркер должен включать все последующие # -характеры
- Подготовьте текст для каждого маркера
- Убедитесь, что ваш текст использует только символы ASCII (см. Ниже)
- Убедитесь, что ваш текст не длиннее маркеров ревизий
- Заполните метки ревизий новым содержимым и заполните оставшиеся # -символы пробелами
Если программное обеспечение не находит новую строку, кто-то должен добавить новые шаблоны строк в Word.
Причина некоторых ограничений:
без вставки: многие вещи хранятся с адресами в текстовом потоке (множество внутренних дополнительных таблиц, которые содержат ссылки на адреса поверх текстового содержимого). Это относится к границам абзацев, форматированию символов, пометкам в таблице, закладкам, графическим ссылкам и т. Д. Некоторые вещи охватываются HWPF, многие - нет. Если вы вставите текст, адреса могут измениться, и файл Word может быть поврежден.
Диапазон ASCII: последовательности текста хранятся в виде 1 байта на символ или 2 байта на символ. Если вы делаете это правильно, вставка не-ASCII символа в 1-байтовый диапазон требует преобразования этого диапазона в 2-байтовый диапазон. Это не всегда хорошо работает в HWPF и приводит к смещению адреса (см. "Без вставки" выше).
Вы можете обойтись без некоторых ограничений, если ваш документ "проще". Например: нет текстовых полей лучше. Нет встроенных рисунков лучше. Нет вложенных таблиц лучше. Однако, как правило, ограничения настолько строги, что вы также можете использовать простой текстовый документ и дать ему расширение.doc.
Дайте мне знать, если вам нужно больше деталей.