Ошибка записи в файл .doc с помощью Apache POI

Я пишу приложение для отображения и редактирования файла .doc. Я использую POI с HWPF. Теперь я могу читать текст из файла и записывать в файл .doc. Но мой ридер читает только файл по умолчанию .doc, созданный msoffice. Он не может читать файл, созданный моим писателем, также msoffice может читать его, и все содержимое отображается правильно. Всегда показывает ошибку:

Exception in thread "main" java.lang.RuntimeException:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at org.apache.poi.hwpf.extractor.WordExtractor.getText(WordExtractor.java:322)
at ReadPOI.main(ReadPOI.java:18)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at org.apache.poi.hwpf.usermodel.Range.binarySearchStart(Range.java:1016)
at org.apache.poi.hwpf.usermodel.Range.findRange(Range.java:1095)
at org.apache.poi.hwpf.usermodel.Range.initParagraphs(Range.java:982)
at org.apache.poi.hwpf.usermodel.Range.numParagraphs(Range.java:311)
at org.apache.poi.hwpf.converter.AbstractWordConverter.processParagraphes(AbstractWordConverter.java:1058)
at org.apache.poi.hwpf.converter.WordToTextConverter.processSection(WordToTextConverter.java:435)
at org.apache.poi.hwpf.converter.AbstractWordConverter.processSingleSection(AbstractWordConverter.java:1126)
at org.apache.poi.hwpf.converter.AbstractWordConverter.processDocument(AbstractWordConverter.java:722)
at org.apache.poi.hwpf.extractor.WordExtractor.getText(WordExtractor.java:304)
... 1 more

Есть ли разница между файлом, созданным msoffice, и файлом, созданным моим писателем, и как это исправить. Пожалуйста помогите. Есть мой демо-код на Java. Спасибо

Мой читатель:

import java.io.File;
import java.io.FileInputStream;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.Range;


public class ReadPOI 
{
public static void main(String args[]) throws Exception
{
    File file = new File("Test.doc");
    FileInputStream fin = new FileInputStream(file);
    HWPFDocument doc = new HWPFDocument(fin);
    Range range = doc.getRange();
    WordExtractor extractor = new WordExtractor(doc);
    System.out.println("starting\n" + extractor.getText() + "end\n");

    fin.close();
}
}

Мой писатель:

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

import org.apache.poi.hwpf.HWPFDocument;

public class WritePOI
{
public static void main(String args[]) throws Exception
{
    File file = new File("Template.doc");
    FileInputStream fin = new FileInputStream(file);
    HWPFDocument doc = new HWPFDocument(fin);
    doc.getRange().replaceText("Haha\n", false);
    FileOutputStream fout = new FileOutputStream("Test.doc");
    doc.write(fout);
    fout.close();
    fin.close();
}
}

person tqn    schedule 16.12.2012    source источник
comment
Какую версию POI вы используете? И если это не последняя версия (3.9), вы пробовали обновить?   -  person Gagravarr    schedule 16.12.2012
comment
да. Я использую ПОИ 3.9. Я скачал его недавно, и это мой первый раз, когда я использую его.   -  person tqn    schedule 16.12.2012


Ответы (1)


Это ошибка в WordExtractor getText(), которая сохраняется даже до версии 3.10-FINAL. Это не должно давать вам:

Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:571)
    at java.util.ArrayList.get(ArrayList.java:349)
    at org.apache.poi.hwpf.usermodel.Range.binarySearchStart(Range.java:1016)

Он не помечен как устаревший в API. но он говорит, что getTextFromPieces() работает быстрее. Я дважды проверил это на вашем примере, и он работает нормально.

Итак, в ReadPOI используйте:

    System.out.println(extractor.getTextFromPieces());

Or

    String [] dataArray = extractor.getParagraphText();
    for(int i=0;i<dataArray.length;i++)
    {
        System.out.println("\n–" + dataArray[i]);
    }
person PbxMan    schedule 18.03.2014