"Apache POI: Impossible d'écrire sur un classeur existant
Je travaille sur un projet qui a besoin de lire un Classeur Excel, appelle le nécessaire des Services Web, et prend alors la réponse de la webservices et entre cette information dans le même Classeur Excel qui a été lu.
Voici l'erreur que je vois lorsque vous tentez d'écrire dans le Classeur Excel:
Exception in thread "main" org.apache.poi.POIXMLException: java.io.IOException: Can't obtain the input stream from /docProps/app.xml
at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:141)
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:177)
at ext.ExcelProcessor.main(ExcelProcessor.java:197)
Caused by: java.io.IOException: Can't obtain the input stream from /docProps/app.xml
at org.apache.poi.openxml4j.opc.PackagePart.getInputStream(PackagePart.java:500)
at org.apache.poi.POIXMLProperties.<init>(POIXMLProperties.java:75)
at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:139)
... 2 more
Voici mon code pour l'ouverture de dossier/lecture:
pkg = OPCPackage.open(xslFile);
theWorkbook = new XSSFWorkbook(pkg);
Après ce que j'ai lu chaque ligne et extraire chaque valeur de cellule.
Une fois que ceci est fait, je vais créer des cellules sous les en-têtes pour la Réussite et le Message de Résultat et puis effectuez les opérations suivantes:
String sessionData = sessionKey[1];
String[] cellValCurrRow = rowCellVals.get(r-1);
String attachmentData[] = WQSServices.uploadAttachment(sessionData, cellValCurrRow);
XSSFCell cell = xslRows[r].getCell(7);
if(cell == null)
{
cell = xslRows[r].createCell(7);
}
System.out.println("The Cell: "+cell.getStringCellValue());
XSSFCell cell2 = xslRows[r].getCell(8);
if(cell2 == null)
{
cell2 = xslRows[r].createCell(8);
}
System.out.println("The Cell: "+cell2.getStringCellValue());
cell.setCellType(Cell.CELL_TYPE_STRING);
cell2.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(attachmentData[0]);
cell2.setCellValue(attachmentData[1]);
System.out.println("New Cell Data: 1-"+cell.getStringCellValue()+" 2-"+cell2.getStringCellValue());
FileOutputStream fos = new FileOutputStream(xslFile);
theWorkbook.write(fos);
fos.close();
Quelqu'un a couru vers problème similaire?
ce que les fichiers jar-vous ajouter?avez-vous ooxml fichier jar inclus dans le classpath?
Dans mon référencé bibliothèques dans Eclipse, j'ai le texte suivant: poi-3.8-20120326.jar poi-examples-3.8-20120326.jar poi-excelant-3.8-2012032.jar poi-ooxml-3.8-2012326.jar poi-ooxml-schemas-20120326.jar
k ce sujet dom4j-1.6.1.jar star-api-1.0.1.jar et xmlbeans-2.3.0.jar fichiers? Je crois que ce sont les dépendances de poi-ooxml fichiers jar
Voulez-vous dire stax-api-1.0.1.jar si oui, je les ai tous les 3.
[Solution pour mon problème qui fixe mes problèmes][1] [1]: stackoverflow.com/a/9792406/1231715
Dans mon référencé bibliothèques dans Eclipse, j'ai le texte suivant: poi-3.8-20120326.jar poi-examples-3.8-20120326.jar poi-excelant-3.8-2012032.jar poi-ooxml-3.8-2012326.jar poi-ooxml-schemas-20120326.jar
k ce sujet dom4j-1.6.1.jar star-api-1.0.1.jar et xmlbeans-2.3.0.jar fichiers? Je crois que ce sont les dépendances de poi-ooxml fichiers jar
Voulez-vous dire stax-api-1.0.1.jar si oui, je les ai tous les 3.
[Solution pour mon problème qui fixe mes problèmes][1] [1]: stackoverflow.com/a/9792406/1231715
OriginalL'auteur Matthew Lancaster | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même message d'erreur mais il avait utilisé de différentes classes. Actuel poi version que j'utilise est de poi-ooxml de 3,9 mais il a encore le problème. Maintenant j'ai résolu mon problème et je pense que ce problème se pose lors de l'obtention de Classeur exemple au premier abord.
Quand j'écris des données dans le fichier, je fais comme ceci (avec de la pratique, règles et exceptions près):
Je suis "ne Peut pas obtenir le flux d'entrée de /docProps/app.xml" message d'erreur lorsque j'ai obtenu Classeur exemple comme ceci:
Quand j'ai résolu le problème, le code modifié a été
Dans mon cas, il n'a pas d'importance si vous d'ouvrir et de lire et d'écrire dans le même fichier, ou lire à partir d'un fichier puis d'écrire à l'autre. Si vous avez lu la pi codes sources, vous pouvez voir l'usine méthodes que j'utilise peut-appel open() méthodes de OPCPackage classe. Essayez d'utiliser la méthode d'obtention de InputStream comme argument.
cit. @Bankie: "en cours de poi version que j'utilise est de poi-ooxml de 3,9 mais il a toujours la question.". Je suis en utilisant 3.17 et il a cette question
OriginalL'auteur Bankie
Je pense que le problème ici c'est que vous êtes en utilisant le même chemin d'accès
xslFile
pourouverture et enregistrement du fichier.
De l'ouverture du fichier,
De l'enregistrement du fichier,
Vous avez besoin d'un InputStream pour lire et travailler avec votre fichier, mais ce
flux devenue inaccessible lorsque vous créez un
OutputStream sous le même chemin et nom de fichier.
Cela a été posté par un administrateur de l'apache-groupe de poi: Si un classeur est créé à partir d'une instance de la OPCPackage classe, le OPCPacakge instance ne doit pas être éliminé jusqu'à ce que après le classeur a été écrit. Cette modification du code, enlevé complètement le problème; org.apache.pi.openxml4j.opc.OPCPackage opc = org.apache.pi.openxml4j.opc.OPCPackage.open(filename); org.apache.pi.xssf.usermodel.XSSFWorkbook wb = new org.apache.pi.xssf.usermodel.XSSFWorkbook(opc); java.io.FileOutputStream fileOut = new java.io.FileOutputStream(filename); wb.écrire(fileOut); opc.close(); fileOut.close();
pouvez-vous nous donner le lien?
Ce commentaire a été basé sur un autre bug, mais il ne surround mon problème. issues.apache.org/bugzilla/show_bug.cgi?id=53613
OriginalL'auteur Jayamohan
La question actuelle de la liste est un bug qui a été autour depuis 2010 et peuvent être trouvés @ https://issues.apache.org/bugzilla/show_bug.cgi?id=49940
Dans le stackoverflow la liste ci-dessous une solution de contournement a été constaté que si vous fermez et ré-ouvrez de nouveau le livre avant de faire une autre écriture dans le fichier, il fonctionne sans problème. Ce n'est pas efficace par tous les moyens, mais il n'résoudre le problème jusqu'à ce que l'Apache POI Équipe de Dev sur les chiffres de la question.
https://stackoverflow.com/a/9792406/1231715
OriginalL'auteur Matthew Lancaster
La solution que j'ai trouvé pour cela, et j'ai été à la recherche d'un certain temps, assurez-vous de ne pas ouvrir votre
Workbook
avec leFile
que vous utilisez pour ouvrir laFileOutputStream
pour enregistrer leWorkbook
. Au lieu de cela, utilisez unFileInputStream
pour ouvrir laWorkbook
.Quelque chose comme cela fonctionnera parfaitement
Ne pas oublier de fermer ouvert tous les flux de données et la
OPCPackage
.OriginalL'auteur Jonathan Drapeau
Ici est de savoir comment cela peut être fait lors de l'utilisation de OPCPackage à lire (try/catch/finally oublié pour la lisibilité):
Le commentaire ci-dessus à partir de Jayamohan m'a aidé à résoudre ce problème aujourd'hui (à l'aide de différentes chemin d'accès au fichier pour l'Entrée et pour la Sortie). Merci!!!!
OriginalL'auteur Robert