Erreur lors de la lecture d'Excel .XLSX avec Apache POI
Je suis en utilisant Apache POI 3.8 bibliothèques pour lire un fichier XLSX dans une application web. Le code suivant fonctionne parfaitement bien à partir d'une console Java app:
InputStream inputFS = new FileInputStream("test.xlsx");
Workbook workbook = new XSSFWorkbook(inputFS); //below exception is thrown on this line
Sheet sheet = workbook.getSheetAt(0);
mais jette une "erreur de lecture" lorsqu'il est utilisé dans l'application web. Un extrait de la trace de la pile est collé ci-dessous:
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]
JARs suivants sont inclus dans le classpath (dans le même ordre):
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
Il ne semble pas être liée à la mémoire de questions depuis que j'ai rassemblé quelques tas de l'utilisation des stats juste avant d'invoquer le code ci-dessus. Le fichier XLSX est de 1,15 MO en taille.
##### Heap utilization statistics [MB] #####
Used Memory:13 MB
Free Memory:9 MB
Total Memory:23 MB
Max Memory:247 MB
votre web app afficher/modifier les fichier de votre lecture?
L'application web a accès au fichier, si c'est ce que vous demandez. Il lit uniquement (pas de modification). Sur une note connexe, la web app processus XLS (l'ancien format binaire) des fichiers sans problème. C'est seulement avec les fichiers XLSX qu'il se heurte à un problème.
sont l'une des nouvelles fonctionnalités utilisées qu'elle ne supporte pas? poi.apache.org/spreadsheet/index.html
L'application web a accès au fichier, si c'est ce que vous demandez. Il lit uniquement (pas de modification). Sur une note connexe, la web app processus XLS (l'ancien format binaire) des fichiers sans problème. C'est seulement avec les fichiers XLSX qu'il se heurte à un problème.
sont l'une des nouvelles fonctionnalités utilisées qu'elle ne supporte pas? poi.apache.org/spreadsheet/index.html
OriginalL'auteur Web User | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
La méthode utilisant le code ci-dessus a un seul paramètre FileInputStream. La première ligne dans l'extrait de code est très bien partie du code, mais une partie de l'invocation de la méthode. Puisque la méthode en question n'ont pas connaissance de la format Excel, ou même une extension de fichier pour faire une supposition éclairée, j'ai décidé que je voudrais d'abord essayer de lire la FileInputStream à l'aide de HSSF API comme ci-dessous:
Le problème avec le code ci-dessus est que l'état de la
inputFS
objet lors de la seconde tentative de l'ouvrir via le XSSF API est inconnue. Et cela a donné unread error
. J'ai remplacé le ci-dessus avec le code suivant, qui fonctionne très bien et le problème semble être résolu:J'ai testé avec les deux XLS (âgées, binaire) et XLSX (plus récent, basé sur XML) les formats et ça fonctionne. Merci pour l'aide de tous et en entrée!
OriginalL'auteur Web User
L'exception indique qu'il y a quelque chose avec votre InputStream. Toutefois, si vous avez un fichier, puis passer que dans de POI directement!. À l'aide d'un InputStream nécessite la mise en mémoire tampon de tout ce qui est dans la mémoire, qui mange de l'espace. Puisque vous n'avez pas besoin de faire de mise en mémoire tampon, ne pas! Tout en évitant de le tampon devrait résoudre votre problème de toute façon
Si vous êtes en cours d'exécution avec la dernière nightly builds de PI, il est alors très facile. Votre code devient:
Sinon, c'est très similaire:
Si vous n'êtes pas sûr si votre fichier est un HSSFWorkbook ou XSSFWorkbook, vous pouvez utiliser le WorkbookFactory pour ouvrir le plus approprié pour vous:
WorkbookFactory.create(...)
depuis je ne sais pas si le fichier est HSSFWorkbook ou XSSFWorkbook.Assurez-vous d'utiliser la version du Fichier plutôt que de l'InputStream version si vous avez un Fichier réel de l'objet, il va être plus rapide et moins de mémoire!
pourquoi puis-je obtenir
java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.WorkbookFactory
, quand j'ai tous les pots dans la lib? (NetBeans)Assurez-vous d'avoir à la fois le PI pots et leurs dépendances sur votre classpath, et assurez-vous que vous n'avez pas une copie plus ancienne sur leur chemin. Le PI composants de la page les détails de ce que vous avez besoin!
OriginalL'auteur Gagravarr
il semble que vous ayez besoin d'utiliser leur XSSF API
Et vous pouvez travailler avec l'ancien format à partir d'une application web? Il me semble qu'il faudrait soit que vous ne peut pas accéder au fichier pour quelque raison que ce soit, ou vous ne pouvez pas lire le format qu'il utilise.
On dirait qu'ils sont à l'aide d'un XSSFReader dans l'exemple de code, vous n'êtes pas en train de faire. Cependant, ce n'est pas pour expliquer pourquoi il serait de travailler dans une application console... ce Qui donne plus de soutien pour qu'il soit un problème d'autorisation. Peut-être essayer de voir si votre application permet de voir/lire?
Peut-être POI requiert des autorisations en écriture? Il ne serait d'échouer si vous ne pourrais pas le lire? Il semble vraiment étrange que l'exacte même fichier peut être lu à partir d'une application console et pas une application web avec le même code de soutien, sauf s'il y a une sorte de sécurité type de problème. Où est le fichier stocké?
Aucune chance pour que votre fichier est ouvert dans un autre programme?
OriginalL'auteur John Kane
utiliser ce pot
OriginalL'auteur Kattamuru Deepak