HWPF-POI: вставка таблицы в документ с poi hwpf не отображается

Я хочу вставить таблицу в определенную позицию с помощью poi, таблица генерируется, но я считаю, что эта таблица не видна.

Сгенерированная таблица в doc видна при предварительном просмотре или редактировании этого документа с помощью macOS и его текстового инструмента, POI также может читать таблицу и содержимое. Я планирую загрузить 4 изображения для отображения процесса, но я могу опубликовать только 2 изображения, извините за это.

@Test
public void exportDoc() throws Exception {
    FileInputStream readFile = new FileInputStream(new File(readDoc));
    FileOutputStream replaceFile = new FileOutputStream(new File(replaceDoc));
    HWPFDocument document = new HWPFDocument(readFile);
    Table table = WordUtil.insertNewTable(document,"${table}");
    insertTableInDoc(table);
    document.write(replaceFile);
    readFile.close();
    replaceFile.close();
}

private Table insertNewTable(HWPFDocument doc, String sourceValue) {
    Range range = doc.getRange();
    Table table = null;
    for (int i = 0; i < range.numSections(); ++i) {
        Section s = range.getSection(i);
        for (int x = 0; x < s.numParagraphs(); x++) {
            Paragraph p = s.getParagraph(x);
            if (p.text().contains(sourceValue)) {
                //remove target text
                range.replaceText(sourceValue, "");
                table = p.insertTableBefore((short) 3, 3);
                return table;
            }
        }
    }
    return table;
}

private void insertTableInDoc(Table table) {
    int count = 1;
    for (int rowNum = 0; rowNum < table.numRows(); rowNum++) {
        TableRow tableRow = table.getRow(rowNum);
        for (int colNum = 0; colNum < tableRow.numCells(); colNum++) {
            TableCell cell = tableRow.getCell(colNum);
            Paragraph paragraph = cell.getParagraph(0);
            CharacterRun characterRun = paragraph.getCharacterRun(0);        
            characterRun.insertBefore("number: " + count++);
        }
    }
}
  1. оригинальный документ

  2. документ после таблицы вставить

PS:

Я уверен, что это не Microsoft для проблемы Mac, генерировать таблицу в doc на платформе Windows тоже не видно.

(Первый раз, чтобы задать вопрос, если что-то не так или мое выражение не ясно, пожалуйста, дайте мне знать, и я изменю его без промедления. Спасибо)

1 ответ

Решение

С текущим состоянием проекта HWPF вам, скорее всего, не повезет при попытке вставить контент в файл.doc. Лучше всего использовать другой формат (docx).

Я не смотрел на HWPF в прошлом году, поэтому я могу ошибаться в отношении текущего состояния HWPF:

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

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

Так что если можете, используйте docx или rtf. Если это вариант, вы можете попробовать одну из коммерческих библиотек, которые могут обрабатывать файлы.doc.

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