APACHE POI 3.5 - Lecture de fichier XLSX - InvalidFormatException !

Signaler
Messages postés
5
Date d'inscription
mercredi 27 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009
-
Messages postés
2
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
7 août 2012
-
Bonjour à tous,

Je viens de récupérer la dernière version du module POI d'Apache (poi-3.5-beta5-20090219.jar) afin de lire et d'écrire des fichiers EXCEL 2007 (.xlsx), mais je n'arrive même pas à faire fonctionner un exemple tout simple...

J'ai investigué tout l'après-midi et je ne trouve pas pourquoi. Voici l'exception générée lorsque j'essaye de lire un fichier ".xlsx":

Exception in thread "main" org.apache.poi.openxml4j.exceptions.InvalidFormatException: Can't read content types part !

Que ce soit un fichier issu directement d'EXCEL 2007 ou un fichier généré par POI lui-même, l'exception est levée...

Voici le code source de ma classe qui essaye de lire un fichier, rien de plus simple:
________________________________________________________
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;

public class Toto
{
    public static void main(String[] args)
    {
       try
       {
          XSSFWorkbook wb= new XSSFWorkbook("c:\\DemoCell.xlsx");
          XSSFSheet sheet=(XSSFSheet)wb.getSheetAt(0);
          int lastRowNum=sheet.getLastRowNum();
            
          for(int i=0;i<lastRowNum;i++)
          {
               XSSFRow row=sheet.getRow(i);
               int lastCellNum=row.getLastCellNum();
               System.out.println("\n => LIGNE "+i+"\n");
                
               for(int j=0;j<lastCellNum;j++)
               {
                   XSSFCell cell=row.getCell(j);
                   String s1=cell.getRawValue();
                   System.out.println(s1+";");
               }
          }
      }
      catch(Exception e)
     {
         e.printStackTrace();
      }
   }
}
________________________________________________________

C'est l'instanciation new XSSFWorkbook("c:\\DemoCell.xlsx"); qui plante.

En regardant sur le net, je vois en effet qu'un document OPEN XML doit avoir un type reconnu, par exemple:

* docx : application/vnd.openxmlformats-officedocument.wordprocessingml.document

* xlsx : application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

etc...

Dans mon cas (Can't read content types part !), l'API n'arrive pas à reconnaitre le type de contenu de mon fichier xlsx, mais pourquoi ???

Avez-vous une idée ? Avez-vous déjà rencontré ce probléme ? Et si oui comment l'avez-vous résolu ?

J'ai cherché sur plusieurs forum US, l'exception InvalidFormatException a déjà été rencontrée, mais sans réponse satisfaisante...

Vous m'aideriez beaucoup si vous aviez la solution, car la je sèche...

Merci d'avance.

9 réponses

Messages postés
4
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
11 juin 2009

Bjr,

je suis dans le même cas que toi, t as trouvé la solution à ton problème ?

merci
Messages postés
5
Date d'inscription
mercredi 27 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

Pour le moment je n'ai pas trouvé...

En dézippant un fichier XLSX (car en fait, ce n'est qu'une archive, il suffit de renommer le fichier en ".zip"), tu te rends compte qu'à la racine il y a un fichier "[Content_Types].xml" .

C'est ce fichier qui doit apparemment définir les différents types (Can't read content types part !).

Et bien POI ne le comprendrait pas ou ne le concidérerait pas comme valide (pourtant ce vient de MICROSOFT WORD lui-même...). De toute facon, le même probléme survient avec un fichier XLSX généré par POI.

Je pense donc tout simplement qu'il y a un sacré BUG dans POI...

Voici à quoi ressemble "[Content_Types].xml":

<?xml version= "1.0" encoding="UTF-8" standalone="yes"?>

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">

<Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml" />

<Override PartName ="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>

<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>

<Default Extension="xml" ContentType="application/xml"/>

<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>

<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>

<Override PartName="/xl/worksheets/sheet2.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>

<Override PartName="/xl/worksheets/sheet3.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>

<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>

<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>

<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/></Types>
Messages postés
4
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
11 juin 2009

J'ai trouvé !!!

Mais j 'ai laché l'affaire pour modifier un fichier xlsx = xls (excel 2003) + xml

déja pour enlever l'erreur que tu as, il faut inclure dans ton projet touts les .jar contenu dans la version beta de POI.

Ensuite y va y avoir un nouveau message d erreur.
tu dois trouver ce fichier : log4j.properties
tu le copies dans ton projet et rajoute a la fin de ce fichier :

log4j.logger.org.openxml4j=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

Quand tu as fini tu peux lire le fichier excel comme tu faisais, attention aux pointeurs nuls...javascript:Insert_Emoticon('/imgs2/smile_dissapprove.gif');

Par contre pour modifier un fichier xlsx c est trop compliquer il faut redéfinir le xml ....javascript:Insert_Emoticon('/imgs2/smile_clown.gif');
Messages postés
5
Date d'inscription
mercredi 27 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

Merci, mais moi je savais déjà ouvrir un fichier EXCEL simple (XLS), j'utilise l'API JEXCEL pour ca.

Ce qui m'intéresse avec POI, c'est justement les fichiers XLSX...
Messages postés
4
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
11 juin 2009

avec ce que je t ai dit tu peux l ouvrir un .xlsx et afficher le fichier dans la console d'éclipse par exemple. Mais pour la modif c est autre chose... j y suis pas arrivé javascript:Insert_Emoticon('/imgs2/smile_sad.gif');
Messages postés
5
Date d'inscription
mercredi 27 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

Ah ok. J'avais pas compris.

Tu peux me lister les JARs ? Car dans Eclipse je pense avoir tout mis. Voici ma liste:

poi-3.5-beta5-20090219.jar
poi-contrib-3.5-beta5-20090219.jar
poi-ooxml-3.5-beta5-20090219.jar
poi-scratchpad-3.5-beta5-20090219.jar
ooxml-schemas-1.0.jar
log4j-1.2.8.jar
dom4j-1.6.1.jar
jsr173_1.0_api.jar
resolver.jar
xbean.jar
xbean_xpath.jar
xmlbeans-qname.jar
xmlpublic.jar

Merci.
Messages postés
4
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
11 juin 2009

pour les 4 poi j'ai les même. Ensuite j'ai : commons-logging-1.1.jar, junit-3.8.1.jar, log4j-1.2.13.jar qui sont dans lib. et j'ai aussi : dom4j-1.6.1.jar, jsr173_1.0_api.jar, ooxml-schemas-1.0.jar, xmlbeans-2.3.0.jar qui eux sont dans ooxml-lib. et c est tout j'avais aussi jxl.jar pour les .xsl mais je pense qu elle ne change rien.
Messages postés
5
Date d'inscription
mercredi 27 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

Bah chez moi cela ne change rien...

Ca continue de ne pas fonctionner. Même erreur: Can't read content types part !
Messages postés
2
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
7 août 2012

Bonjour
je cherche à modifier le contenu d'un fichier .xlsx (déjà existant)à partir d'une application java
veuillez m'aider svp

maryam_mimo