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

API standards et tierces Java Discussion :

jxl.Workbook.createWorkbook(File file,Workbook in) - java.lang.IndexOutOfBoundsException: Index: 26, Size: 24


Sujet :

API standards et tierces Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut jxl.Workbook.createWorkbook(File file,Workbook in) - java.lang.IndexOutOfBoundsException: Index: 26, Size: 24
    Bonjour,
    j'utilise la librairie jxl afin de creer et sauvegarder des .xls avec java, cependant j'ai constaté une erreur lorsque j'essaie d'ouvrir un .xls creer par mon application (cette erreur n'a pas lieu pour tous les .xls creer par mon application mais seulement certains)

    Tout d'abord je declare mes "workbook"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbook workbookRead;
    WritableWorkbook workbook=null;
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    File fileOut=new File(nomFichier);
    File filein=new File(nomFichiercopie);
    workbookRead=Workbook.getWorkbook(filein);
    workbook=Workbook.createWorkbook(fileOut,workbookRead);//ligne 856 de RS232fileXL.java
    et j'obtiens cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 26, Size: 24
    	at java.util.ArrayList.rangeCheck(Unknown Source)
    	at java.util.ArrayList.get(Unknown Source)
    	at jxl.biff.FormattingRecords.getNumberFormat(FormattingRecords.java:244)
    	at jxl.read.biff.NumberRecord.<init>(NumberRecord.java:73)
    	at jxl.read.biff.SheetReader.read(SheetReader.java:496)
    	at jxl.read.biff.SheetImpl.readSheet(SheetImpl.java:716)
    	at jxl.read.biff.WorkbookParser.getSheet(WorkbookParser.java:257)
    	at jxl.write.biff.WritableWorkbookImpl.copyWorkbook(WritableWorkbookImpl.java:969)
    	at jxl.write.biff.WritableWorkbookImpl.<init>(WritableWorkbookImpl.java:343)
    	at jxl.Workbook.createWorkbook(Workbook.java:339)
    	at jxl.Workbook.createWorkbook(Workbook.java:320)
    	at projetSMTP.RS232fileXL.createFileExcel(RS232fileXL.java:856)
    PS: Si j'ouvre mon fichier .xls avec Excel et que je fais Ctrl+S, je n'obtiens plus l'erreur par la suite.

    Auriez-vous une solution ?

    Cordialement.

  2. #2
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Citation Envoyé par poiuyu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.IndexOutOfBoundsException: Index: 26, Size: 24
    Cette ligne indique que tu essais d'accéder à une case d'un tableau qui n'existe pas.
    Ton tableau a une taille de 24 et toi tu essais d’accéder à la case 26, normal qu'il n'aime pas trop..

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 561
    Points : 21 624
    Points
    21 624
    Par défaut
    Et les lignes d'après indiquent que c'est la petite cuisine de JXL qui fait ça. Probablement des cases de tableur qui ne se retrouvent pas les unes les autres, ou qui sont pas dans le bon état, ou que sais-je. L'habituel chamanisme avec les fichiers MS Office.

    Mais bon, pour copier un fichier, c'est inutile de passer par JXL. Files.copy() est bien suffisant.

  4. #4
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Les fichiers xls que vous ouvrez, sont-ils tous avec certitude des fichiers xls format Excel 97 ?...
    Si c'est le cas, dans les fichiers qui plantent, il y a peut-être des lignes masquées. C'est possible dans Excel de rendre des lignes, ou des colonnes invisible. Il est aussi possible que des volets aient été figés.
    Il y a des limites à jxl...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pursang Voir le message
    Les fichiers xls que vous ouvrez, sont-ils tous avec certitude des fichiers xls format Excel 97 ?...
    Si c'est le cas, dans les fichiers qui plantent, il y a peut-être des lignes masquées. C'est possible dans Excel de rendre des lignes, ou des colonnes invisible. Il est aussi possible que des volets aient été figés.
    Il y a des limites à jxl...
    Les fichiers .xls que j'ouvre sont des fichiers crées par JXL.

    Citation Envoyé par thelvin Voir le message
    Mais bon, pour copier un fichier, c'est inutile de passer par JXL. Files.copy() est bien suffisant.
    Je ne cherche pas à copier un fichier, mais à ouvrir un fichier xls lors du relancement de mon application, afin d'écrire à la suite


    Apparament, selon JExcelApi Yahoo Group, JXL n'est pas conçu (et debuggé) pour ouvrir des fichiers xls créer par JXL.
    J'ai essayer d'ouvrir les fichiers xls avec apache POI, ça marche, mais les ouvrir avec POI et les sauvegarder n’empêche pas l'erreur (alors qu'ouvrir avec excel et sauvegarder l’empêche), modifier la totalité de mon code pour le faire fonctionner avec POI n'est pas souhaitable (l'API jxl est utilisé un peu partout dans mes milliers de ligne de code, et l'utilisation de POI semble différente de celle de jxl)

  6. #6
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Avez-vous la possibilité de mettre à disposition un tel fichier, avec un contenu fictif bien sûr ?
    Ce que vous décrivez m'intéresse. Et cela me permettrait de chercher et peut-être vous aider à trouver une solution...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pursang Voir le message
    Avez-vous la possibilité de mettre à disposition un tel fichier, avec un contenu fictif bien sûr ?
    Ce que vous décrivez m'intéresse. Et cela me permettrait de chercher et peut-être vous aider à trouver une solution...
    Bien sur, voir pièce jointe.
    Merci.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Je crois que j'ai trouvé d'où vient le problème.
    Dans le fichier que vous avez mis à disposition, la feuille nommée "Présence par métiers" contient des valeurs numériques précédées d'un espace, rendant les cellule du type texte, alors qu'elle contiennent des nombres. Cela ne pose pas de problème en lecture, en effet, l'instance de lecture Workbook n'est pas gênée. Par contre, l'instance WritableWorkbook générée par la méthode createWorkbook, elle doit pouvoir écrire, donc, elle tente de convertir le type de donnée contenues en objet Java. Moralité, l'api jxl tente de lire un nombre dans un champ texte...
    Si vous modifiez simplement le format de cellule des cellules de la colonne B de cette feuille en type Nombre, l'instance de WritableWorkbook aboutit, l'écriture devient possible, ect....
    Si toutefois vous êtes face à une contrainte qui ne vous permet pas de changer le format de ces cellules, dans ce cas, n'utilisez pas la technique de saisie en précédent les nombres par un espace, mais fixez manuellement le format de cellule à Texte, et cela ne posera pas de problème.
    Pour conclure, MSOffice n'est pas à mettre en cause.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pursang Voir le message
    Je crois que j'ai trouvé d'où vient le problème.
    Dans le fichier que vous avez mis à disposition, la feuille nommée "Présence par métiers" contient des valeurs numériques précédées d'un espace, rendant les cellule du type texte, alors qu'elle contiennent des nombres. Cela ne pose pas de problème en lecture, en effet, l'instance de lecture Workbook n'est pas gênée. Par contre, l'instance WritableWorkbook générée par la méthode createWorkbook, elle doit pouvoir écrire, donc, elle tente de convertir le type de donnée contenues en objet Java. Moralité, l'api jxl tente de lire un nombre dans un champ texte...
    Si vous modifiez simplement le format de cellule des cellules de la colonne B de cette feuille en type Nombre, l'instance de WritableWorkbook aboutit, l'écriture devient possible, ect....
    Si toutefois vous êtes face à une contrainte qui ne vous permet pas de changer le format de ces cellules, dans ce cas, n'utilisez pas la technique de saisie en précédent les nombres par un espace, mais fixez manuellement le format de cellule à Texte, et cela ne posera pas de problème.
    Pour conclure, MSOffice n'est pas à mettre en cause.
    Tout d'abord merci pour le temps passé sur mon problème, mais je pense que cela ne le résout pas en totalité puisque:
    -1. J'arrive a ouvrir d'autres .xls avec JXL, alors qu'ils ont plus ou moins la même feuille nommée "Présence par métiers" (avec de chiffre sous forme de texte)
    -2. quelque chose que j'ai dit plus haut, mais que vous n'avez pas vu ou mal compris, lorsque que j'ouvre mon .xls "corrompu" avec excel et que je l'enregistre (même sans modification) celui ci à un taille inférieur de quelques ko et n'est plus "corrompu" lors de son ouverture par JXL. Il est donc possible que lorsque vous avez modifiez le format des cellules en type Nombre (je suppose avec Excel), vous avez "de-corrompu" le fichier seulement parce que vous l'avez enregistré via excel et non grace a la modification du format des cellules.

  10. #10
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    D'accord.
    Donc, il y a deux solutions. Soit contourner le problème, soit comprendre l'origine exacte de ce dernier pour tenter de l'éliminer.
    D'après ce que je comprends, votre fichier est corrompu. D'après ce que vous dites, ces fichiers sont tous des fichiers que vous avez créé vous, avec jxl. Donc, les données qui s'y trouvent ont initialement été écrite par une partie de votre code. Je penses qu'il faudrait examiner à la loupe cette partie pour voir comment, par exemple, votre code écrit ces données considérées corrompues. En l'occurrence, pour ce qui concerne la fameuse colonne B de ce fichier.
    Sinon, pour contourner, il faut en fait créer un fichier de départ avec Excel. Entièrement vide et ne contenant qu'une seule feuille. Ensuite, il faut créer comme vous le faites, un Workbook "connecté" au fichier xls d'entrée (le fichier "corrompu"), et créer le WritableWorkbook sur le fichier excel de base. Un premier traitement consistera à créer les feuilles à l'identique du fichier d'entrée, puis de supprimer la première feuille initiale, vide.
    Puis, on copie de l'un à l'autre, on complète, et on enregistre.

    En résumé, serait-il possible de voir le code qui écrit ces données ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2015, 22h41
  2. Erreur "java.lang.IndexOutOfBoundsException: Index: 4, Size: 4"
    Par ddgrissa dans le forum Débuter avec Java
    Réponses: 18
    Dernier message: 04/12/2014, 12h32
  3. Réponses: 5
    Dernier message: 07/02/2013, 12h36
  4. java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    Par john_wili dans le forum Struts 1
    Réponses: 3
    Dernier message: 29/03/2009, 09h42
  5. Erreur java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    Par impossibeulman dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 07/08/2008, 15h18

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