"Dein InputStream war weder ein OLE2 stream, noch eine OOXML-stream" während der Lektüre .xslx-Datei

Ich Lesen möchte Excel-Dateien, die ich übergangen, REST wie InputStream. Dafür habe ich die Klasse ExcelImport:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class ExcelImport {
  public boolean readStream(InputStream stream) {
        boolean success;

        try {
            byte[] bytes = getBytes(stream);
            InputStream wrappedStream = new ByteArrayInputStream(bytes);

            Workbook workbook = WorkbookFactory.create(wrappedStream);

            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                Sheet sheet = workbook.getSheetAt(i);
                for (Row row : sheet) {
                    IterateThroughRow(row);
                }
            }
            success = true;
        } catch (FileNotFoundException e) {
            success = false;
            e.printStackTrace();
        } catch (IOException e) {
            success = false;
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            success = false;
            e.printStackTrace();
        }
        return success;
    }

    private void IterateThroughRow(Row row) {
        Iterator<Cell> cellIterator = row.cellIterator();

        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();

            switch (cell.getCellType()) {
                //do something with the content...
                case Cell.CELL_TYPE_STRING:
                    cell.getStringCellValue();
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    cell.getNumericCellValue();
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    cell.getBooleanCellValue();
                    break;
                default:
            }
        }
    }

    public static byte[] getBytes(InputStream is) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();

        int len;
        byte[] data = new byte[100000];
        while ((len = is.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, len);
        }

        buffer.flush();
        return buffer.toByteArray();
    }
}

Wenn ich dieses mit diesem:

ExcelImport excelImport = new ExcelImport();
InputStream is = new FileInputStream("/path/to/file.xlsx");
excelImport.readStream(is);

Funktioniert es einwandfrei. Aber wenn ich diese Klasse verwenden, mit einem InputStream aus einer PUT über REST bekomme ich diese Exception:
java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream

Ich wickeln Sie den stream, denn wenn ich es nicht tun, bekomme ich diese Exception: Package should contain a content type part. Ich habe diese aus hier.

Ist es nicht möglich, zu Lesen von Excel-Dateien mit Apache POI mit einem Stream vom REST? Oder mache ich etwas anderes falsch?

  • Wie werden Sie senden Sie die Datei auf Ihren code? Wenn Sie Ihren code speichern die gesendete Datei auf der Festplatte, sind die beiden der gleiche, oder ist etwas beschädigt, es in den Prozess?
  • Ich habe in der InputStream bekomme ich, wenn ich will, schicken Sie es mit PUT und dieser stream enthält keine Daten. Vielen Dank für Ihren Hinweis, zu prüfen, ob etwas ist currupted beim senden.
  • wenn Sie möchten, können Sie nach Ihrem Kommentar als Antwort und ich werde es akzeptieren, weil Ihr Hinweis, dass ich haben, um zu überprüfen, ob der stream beschädigt ist gelöst es für mich.
InformationsquelleAutor Peter | 2015-04-27
Schreibe einen Kommentar