Fehler beim Lesen von Excel .XLSX mit Apache POI
Bin ich mit Apache POI 3.8 Bibliotheken zum Lesen von XLSX-Datei in eine web-Anwendung. Der folgende code funktioniert einwandfrei, aus einem Java-console app:
InputStream inputFS = new FileInputStream("test.xlsx");
Workbook workbook = new XSSFWorkbook(inputFS); //below exception is thrown on this line
Sheet sheet = workbook.getSheetAt(0);
wirft aber ein "read error", wenn in der web-Anwendung. Einen entsprechenden Auszug aus dem stack trace ist eingefügt unter:
java.io.IOException: Read error
at java.io.FileInputStream.readBytes(Native Method) ~[na:1.6.0_31]
at java.io.FileInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.FilterInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.PushbackInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readFully(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readLOC(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) ~[na:1.6.0_31]
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:51) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:83) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:228) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:187) ~[poi-ooxml-3.8-20120326.jar:3.8]
at com.corp.ReportManager.parseExcelReport(ReportManager.java:575) [ReportManager.class:na]
Die folgenden jar-Dateien enthalten sind, die in der classpath (in der gleichen Reihenfolge):
poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
xbean.jar
dom4j-1.6.1.jar
Scheint es nicht zu sein, eine Speicher-bezogene Probleme, da sammelte ich einige heap-Auslastung stats nur vor dem Aufruf der obige code. Die XLSX-Datei 1,15 MB in der Größe.
##### Heap utilization statistics [MB] #####
Used Memory:13 MB
Free Memory:9 MB
Total Memory:23 MB
Max Memory:247 MB
- können Sie Ihre web-app ansehen/modifizieren der Datei, die Ihre Lektüre aus?
- Die web-app Zugriff auf die Datei, wenn es das ist, was Sie Fragen. Sie liest nur (no modify). Auf einem verwandten beachten, die web-app verarbeitet XLS (die älteren binären format) - Dateien ohne Problem. Es ist nur mit XLSX-Dateien, die es läuft in ein problem.
- sind die neuen features verwendet werden, die es nicht unterstützen? poi.apache.org/spreadsheet/index.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Methode mit dem obigen code hat einen einzigen parameter - FileInputStream. Die erste Zeile im code-snippet ist sehr viel ein Teil des Codes, sondern Teil der aufrufenden Methode. Da die Methode in Frage, die nicht über Kenntnisse des Excel-format oder auch eine Datei-Erweiterung zu machen, eine Vermutung, habe ich beschlossen, dass ich würde erstmal versuchen zu Lesen FileInputStream mit HSSF API wie folgt:
Das problem mit dem obigen code ist, dass der Zustand der
inputFS
Objekt beim zweiten Versuch es zu öffnen über das XSSF-API ist unbekannt. Und dies ergab eineread error
. Ersetzt habe ich das oben mit dem folgenden code, der funktioniert und das Problem scheint gelöst zu sein:Getestet habe ich dies sowohl mit XLS (ältere, Binär) und XLSX (neuere, XML-basierte) Formate und es funktioniert. Vielen Dank für alle Hilfe und input!
Ausnahme zeigt an, dass es etwas mit Ihrem InputStream. Allerdings, wenn Sie eine Datei haben, dann übergeben Sie, in zu POI direkt!. Mit einem InputStream erfordert Pufferung der alles in den Speicher, das frisst Speicherplatz. Da brauchen Sie nicht zu tun, dass die Pufferung nicht! Um zu vermeiden, dass die Pufferung sollte dein problem lösen sowieso
Wenn Sie mit der neuesten nightly builds von POI, dann ist es sehr einfach. Ihr code:
Ansonsten ist es sehr ähnlich:
Wenn Sie nicht sicher sind, ob Ihre Datei ein HSSFWorkbook oder XSSFWorkbook, dann können Sie die WorkbookFactory zu öffnen, das passende für Sie:
WorkbookFactory.create(...)
da ich nicht weiß, ob die Datei HSSFWorkbook oder XSSFWorkbook.java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.WorkbookFactory
, wenn ich alle jars in das lib? (NetBeans)es sieht aus wie Sie verwenden müssen, um Ihre XSSF-API
inputFS
(FileInputStream) Objekt ist sehr viel zur Verfügung.verwenden Sie diese jar-Datei