2016-08-08 2 views
0

Я хочу вставить таблицу в определенную позицию с помощью poi, таблица сгенерирована, но я считаю, что эта таблица не отображается.HWPF-POI: Вставка таблицы в документ с poi hwpf не отображается

Сгенерированная таблица в документе видна при предварительном просмотре или редактировании этого документа с помощью 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. the original doc

  2. the doc after table insert

PS:

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

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

+0

Для информации: Я могу воспроизвести вашу проблему. Кажется, что таблица, добавленная с insertTableBefore, имеет фиксированную ширину 0. Даже графический интерфейс Word не может исправить это. Но я больше не буду беспокоиться о HWPF (бинарный формат Word). Этот формат устарел с 2007 года. XWPF (Office OpenXML) - это текущий формат. Поскольку никто не ответил, я считаю, что я не единственный, у кого такое мнение. –

+0

Большое спасибо за вашу заботу и ответ. Ранее я объяснял менеджеру по поводу различий между доком и доксом, но она настаивала на поддержке типа документа. Кажется, мы должны изменить нашу стратегию, которая позволяет пользователю экспортировать слово со столом в тип docx. –

ответ

1

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

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

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

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

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

+0

Большое спасибо за вашу заботу и ответ. Вы понимаете много внутренних деталей о POI, и ваше предложение разумно. Очень ценю ваш ответ :) –

Смежные вопросы