Использование POI Для чтения / записи документа с полной системой POIFSFileSystem - PullRequest
0 голосов
/ 27 декабря 2018

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

В настоящее время я делаю это:

POIFSFileSystem pfs = new POIFSFileSystem(fis);
HWPFDocument document = new HWPFDocument(pfs);

Range r1 = document.getRange(); 

…
document.write();

ByteArrayOutputStream bos = new ByteArrayOutputStream(50000);
pfs.writeFilesystem(bos);
pfs.close();

Однако это не удается, с этой ошибкой:

Opened read-only or via an InputStream, a Writeable File is required

Если я не 'Переписать документ, он работает нормально, но мои изменения потеряны.И наоборот, если я сохраняю только документ, а не файловую систему, я теряю верхний / нижний колонтитул.

Теперь проблема в том, как я могу обновить документ, сохранив его как целую файловую систему, илиЕсть ли способ заставить документ содержать все из файловой системы?

1 Ответ

0 голосов
/ 31 декабря 2018

Материал HWPF всегда находится в блокноте, потому что двоичный формат файла DOC является самым ужасным из всех форматов H.Таким образом, он действительно не будет готов, а также во многих случаях будет содержать ошибки.

Но в вашем особом случае ваши наблюдения не воспроизводимы.При использовании apache poi 4.0.1 HWPFDocument содержит заголовок истории, который также содержит истории нижнего колонтитула, после создания из файла *.doc.Поэтому у меня работает следующее:

Источник:

enter image description here

Код:

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hwpf.*;
import org.apache.poi.hwpf.usermodel.*;


public class ReadAndWriteDOCWithHeaderFooter {

 public static void main(String[] args) throws Exception {

  HWPFDocument document = new HWPFDocument(new FileInputStream("TemplateDOCWithHeaderFooter.doc"));

  Range bodyRange = document.getRange();
  System.out.println(bodyRange);
  for (int p = 0; p < bodyRange.numParagraphs(); p++) {
   System.out.println(bodyRange.getParagraph(p).text());
   if (bodyRange.getParagraph(p).text().contains("<<NAME>>")) 
    bodyRange.getParagraph(p).replaceText("<<NAME>>", "Axel Richter");
   if (bodyRange.getParagraph(p).text().contains("<<DATE>>")) 
    bodyRange.getParagraph(p).replaceText("<<DATE>>", "12/21/1964");
   if (bodyRange.getParagraph(p).text().contains("<<AMOUNT>>")) 
    bodyRange.getParagraph(p).replaceText("<<AMOUNT>>", "1,234.56");
   System.out.println(bodyRange.getParagraph(p).text());
  }

System.out.println("==============================================================================");

  Range overallRange = document.getOverallRange();
  System.out.println(overallRange);
  for (int p = 0; p < overallRange.numParagraphs(); p++) {
   System.out.println(overallRange.getParagraph(p).text()); // contains all inclusive header and footer
  }

  FileOutputStream out = new FileOutputStream("ResultDOCWithHeaderFooter.doc");
  document.write(out);
  out.close();
  document.close();

 }
}

Результат:

enter image description here

Поэтому, пожалуйста, проверьте его еще раз и сообщите нам, что именно не работает для вас.Поскольку нам нужно воспроизвести это, предоставьте минимальный, полный и проверяемый пример , как я сделал с моим кодом.

...