IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Documents Java Discussion :

HSSF ouverture Excel


Sujet :

Documents Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut HSSF ouverture Excel
    Bonjour,

    J'ai effectué des recherches pour mon problème mais rien trouvé.
    J'utilise HSSF pour ouvrir et traiter un document Excel. Mon progamme fonctionne très bien si je prend un fichier excel que j'ai créé moi même pour mes tests. Mais si je prend un fichier excel généré par un autre logiciel (un export de données) là je n'arrive pas à l'ouvrir.

    J'ai vérifié les points suivant :
    - Il n'est pas déjà ouvert ou en cours d'utilisation dans un autre processus.
    - j'arrive à l'ouvrir manuellement.
    - si je copie son contenu dans un autre fichier excel, je peut traiter les données.

    Je cherche donc une solution pour rendre mon fichier utilisable. J'ai esayé de le passé au format texte, puis de le repasser au format xls. MAis rien de plus ...

    j'ai vraiment besoin de pouvoir utiliser ce fichier donc si quelqu'un à une idée la dessus, je suis prêt à tout tester.

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    HSSF ne gère peut être pas une version trop récente du format de fichier Excel généré par ton export de données, ou bien il contient des éléments ne lui plaisant pas ...
    Tu peux nous donner l'exception que tu obtiens ?

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Voilà ce qui se passe avec le doc généré automatiquement. Avec un créé à la main tout ce passe pour le mieu.

    Bout de code concerné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public Excel(String CheminFichier){
     
    		try {
    			fis = new FileInputStream(CheminFichier);
    			POIFSFileSystem fs = new POIFSFileSystem(fis);
    			Workbook = new HSSFWorkbook(fs,false);
    			WriteWorkbook = new HSSFWorkbook();
    			sheetLecture = Workbook.getSheetAt(0);
     
    		} catch (FileNotFoundException e) {
    			System.out.println("Fichier non existant dans constructeur Excel");
     
    		} catch (IOException e) {
    			System.out.println("IOExeption dans constructeur excel");
     
    		}		
     
    	}
    Message d'erreur reçut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    IOExeption dans constructeur excel
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at Excel.PositionData(Excel.java:66)
    	at GestionEvent.actionPerformed(GestionEvent.java:66)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Merci

  4. #4
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Tu peux afficher la stack relative à l'exception ? On aurait le message d'erreur de la librairie

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Je sais pas si c'est ca que tu veux, mais je me suis rendu compte que l'erreur se produit sur la ligne juste avant l'ouverture du classeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Class File Editor
    Source not Found
    The jar file poi-3.0.2-FINAL-20080204.jar has no source attachement.
    you can attach the source by clicking attach source below :
    Suivie de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Compiled from POIFSFileSystem.java (version 1.3 : 47.0, super bit)
    public class org.apache.poi.poifs.filesystem.POIFSFileSystem implements org.apache.poi.poifs.dev.POIFSViewable {
     
      // Field descriptor #129 Lorg/apache/poi/poifs/property/PropertyTable;
      private org.apache.poi.poifs.property.PropertyTable _property_table;
     
      // Field descriptor #131 Ljava/util/List;
      private java.util.List _documents;
     
      // Field descriptor #133 Lorg/apache/poi/poifs/filesystem/DirectoryNode;
      private org.apache.poi.poifs.filesystem.DirectoryNode _root;
     
      //[...]  Code trop long et inutile.
    Je ne comprend pas, le fichier existe bien (je le sélectionne via boite de dialogue) je ne comprend pas.

    Merci pour ton aide

  6. #6
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    En fait, je voulais que tu traces la stack de l'exception d'origine, donc en faisant cette modif dans ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Excel(String CheminFichier) {
    ...
    		} catch (IOException e) {
    			System.out.println("IOExeption dans constructeur excel");
    			e.printStackTrace();
    		}
    On aura la "cause" de l'erreur.
    Petite remarque sinon, tu ne fait rien dans le bloc catch, c'est une mauvaise gestion d'erreur. Tu dois la renvoyer (ou l'encapsuler) si tu ne peux pas la traiter. Ton code ne sachant pas que l'ouverture Excel s'est mal produit, le présupposé n'est pas rempli, a savoir les variables non initialisées.

  7. #7
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Voilà ce que j'obtiens après exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    IOExeption dans constructeur excel
    java.io.IOException: Invalid header signature; read 4503599627765769, expected -2226271756974174256
    	at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:103)
    	at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:90)
    	at Excel.<init>(Excel.java:40)
    	at GestionEvent.actionPerformed(GestionEvent.java:62)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at Excel.PositionData(Excel.java:66)
    	at GestionEvent.actionPerformed(GestionEvent.java:66)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Merci à toi et merci pour ton conseil de gestion d'erreur, je vais y remédier.

  8. #8
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    J'ai trouvé une référence indiquant qu'une cause possible du problème serait que le fichier concerné n'est pas un classeur Excel mais un fichier CSV (éventuellement nommé .xls de manière abusive, mais ouvrable par Excel).
    Peux-tu vérifier ce point, et si ce n'est pas le cas, poster le fichier Excel incriminé ?

  9. #9
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Effectivement il y a de très très forte chance pour que tu ai raison. Si tel est le cas, comment puis-je traiter mon fichier comme un fichier excel ?

    Merci encore.

    PS : je ne suis pas sure de pouvoir t'envoyer le fichier xls tel que car les données qu'il contient sont des données patientes confidentielles et que si je modifie son contenue manuellement et enregistre, il me change le format et t'envoyer ce fichier perd tout son intérêt.

  10. #10
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Je comprend parfaitement ton problème d'exemple, dans le doute ne l'envoi surtout pas.
    Tu peux vérifier si ton fichier est bien un fichier Excel en l'ouvrant avec un éditeur texte, si ça ne ressemble pas à du binaire, ce n'est pas un fichier Excel ;-)
    Pour le traiter, il faut le lire comme un fichier texte, analyser les séparateurs de champ ... Des librairies existent comme http://sourceforge.net/projects/javacsv/ mais je ne m'en suis jamais servi.

  11. #11
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Merci de ton aide au moins j'ai une piste pour m'en sortir.

    Encore merci bonne continuation.

  12. #12
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    j'ai pas mal cherché mais je ne trouve rien pour résoudre mon problème.
    Donc d'après djsnipe (et je suis sûr qu'il a raison) le problème viens de l'entête de mon fichier qui au lieu de stipulé qu'il est XLS, il se dit CSV. C'est bien ca djsnipe ?

    Donc je pense que si je trouve le moyen de modifier uniquement l'entête en le forçant XLS, je n'aurais plus de soucis à proprement dit.

    Qu'en penssez vous ?
    Est-ce réalisable ?
    Avez vous des idées pour me permettre de retrouver un bon format de fichier ?


    Merci a vous

  13. #13
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Oula non, je n'est pas tout a fait ça.
    Il ne s'agit pas d'un problème d'entête de fichier mal déclaré, ma piste concernait le format de fichier dans son ensemble.
    Un fichier excel est un format binaire, compréhensible par Excel ou HSSF.
    Un fichier CSV est un format texte, compréhensible par Excel et n'importe quel éditeur de texte (nodepad, ...) et donc, n'importe quel programme.

    Pour savoir si ton fichier est bien un "vrai" fichier Excel, ouvre le avec le notepad, ca doit être flagrant. Si les données sont lisibles à l'oeil nu, c'est du CSV, si ça contient des caractères bizarres (comme : ÐÏࡱá), c'est bien un format Excel.

  14. #14
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    J'arrive bien a lire les données à l'intérieur (avec note pad). donc effectivement c'est pas du Excel.

    ok j'ai compris il faut que je trouve le moyen de le passé en format Excel.

    merci

    PS : si quelqu'un a une idée je suis preneur =)

  15. #15
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Citation Envoyé par mikadoweb Voir le message
    ok j'ai compris il faut que je trouve le moyen de le passé en format Excel.
    J'aurais tendance à préférer une solution à base de parsing de ce CSV. Si j'ai bien compris, tu as déjà un programme qui parse un fichier Excel qui doit extraire par ligne des informations. Il te suffit de le rendre générique pour faire l'abstraction du format de stockage. Par exemple une sorte d'Iterator qui renvoi des objets avec les attributs à extraire, avec une implémentation Excel et une implémentation "fichier CSV".

  16. #16
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Merci djsnipe pour tes conseils. Mais j'ai eu un peu plus de temps pour analyser le fichier excel et ce n'est pas du CSV, si j'ouvre mon fichier excel et que j eclique sur enregistrer, le message suivant apparait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "export.xls est un fichier de feuille de calcul Microsoft excel 2.1. Voulez vous convertir ce fichier au nouveau format ?"
    j'avais pas testé de ré-enregistrer le fichier (sans lui effectuer de modification) et donc si je répond oui à ce message, mon fichier devient traitable par mon programme.

    Pour résumer, je pense que c'est le format du fichier excel qui n'est pas le on mais qu'après enregistrement, il retrouve le format correct.

    je cherche donc un moyen de rendre le bon format à mon fichier excel. Si celà est possible bien sûr. Sinon pour le moment je vais être obligé de demander à mes clients de faire cette petite manip dont il se passerait bien.

    merci

  17. #17
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    C'est donc bien une version trop ancienne du format de fichier, non géré par HSSF, qui traite uniquement les fichiers Excel 97' comme indiqué sur la page d'accueil du projet.
    Je ne pense pas qu'il existe d'API Java pour ce format de fichier (http://jexcelapi.sourceforge.net/ traite uniquement depuis le format Excel 95 par exemple). Donc soit effectivement tes clients se plient à ta contrainte, soit le logiciel d'export est mis à jour pour générer un fichier Excel dans un format plus récent, soit tu écrit un programme qui fasse la conversion, mais là c'est sous windows obligatoirement, avec une version Excel installée.

    Bonne chance pour la suite.

  18. #18
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    Merci pour ces précision.

    Bonne continuation a toi et a bientôt peut être


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'ouverture excel
    Par noir_desir dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/07/2007, 08h37
  2. Probleme Ouverture Excel
    Par Jere76 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 20/04/2007, 14h09
  3. Ouverture excel après exportation
    Par Yves2507 dans le forum Access
    Réponses: 11
    Dernier message: 09/09/2006, 15h25
  4. [VBA-E] Macro automatique ouverture Excel
    Par P50 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/04/2006, 11h42
  5. Ouverture Excel
    Par Tempotpo dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 02/08/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo