Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2509 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  problème crash Excel 2000 après supression d'un onglet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème crash Excel 2000 après supression d'un onglet

n°1928927
tmaoptiim
Posté le 05-10-2009 à 11:17:58  profilanswer
 

Bonjour,

 

Nous utilisons POI version poi-3.2-FINAL-20081019.jar pour la génération de fichier Excel.
La génération est effectuée à partir de template Excel. Lors de cette génération, nous devons supprimer des onglets contenus dans le template.
Pas de problème lors de la génération, en revanche, lorsque l'on ouvre le fichier avec Excel 2000 (version cible), celui-ci fait planter Excel.

 

Voici le code utilisé :

Code :
  1. // workbook creation
  2.       FileInputStream fisTemplateMail = new FileInputStream(nomFichierTemplateMail);
  3.       POIFSFileSystem myPOIFS = new POIFSFileSystem(fisTemplateMail);
  4.       wb_mail = new HSSFWorkbook(myPOIFS, true);
  5.       // modify the name of the first sheet
  6.       wb_mail.setSheetName(0, "mySheet" );
  7.       int nIndiceSheet = wb_mail.getSheetIndex("mySheet" );
  8.       // activation of the first sheet
  9.       wb_mail.setActiveSheet(nIndiceSheet);
  10.       wb_mail.setFirstVisibleTab(nIndiceSheet);
  11.       wb_mail.getSheetAt(nIndiceSheet).setSelected(true);
  12.      
  13.       // remove the sheet named "reception"
  14.       wb_mail.removeSheetAt(wb_mail.getSheetIndex("Reception" ));
  15.       // write the worksheet
  16.       streamOut = new FileOutputStream(outRep+"\\"+"myFile.xls" );
  17.       wb_mail.write(streamOut);
  18.       streamOut.close();
  19.       fisTemplate.close();


Avez-vous une idée de la cause de ce plantage.

 

Merci d'avance


Message édité par tmaoptiim le 06-10-2009 à 09:37:16
mood
Publicité
Posté le 05-10-2009 à 11:17:58  profilanswer
 

n°1929031
lapin21
Posté le 05-10-2009 à 15:28:43  profilanswer
 

Peut-être est-ce parce que tu supprimes l'onglet que tu as sélectionné.

n°1929224
tmaoptiim
Posté le 06-10-2009 à 09:36:34  profilanswer
 

Non l'onglet que je supprime est l'onglet intitulé "Reception" et celui que j'active est "mySheet". J'avais effectivement identifier ce problème avec une version antérieure de POI. Cette même version ne permettant pas l'activation explicite d'un onglet.

n°1929442
cbeyls
Hail to the King, Baby
Posté le 06-10-2009 à 16:15:34  profilanswer
 

C'est peut-être une question idiote mais je vois que tu changes le nom du sheet 0 et ensuite tu fais une recherche de l'indice du sheet qui porte le nom que tu viens de mettre... cet indice sera 0 donc pourquoi faire une recherche?
 
Sinon as-tu vérifié que getSheetIndex renvoie une valeur correcte pour l'onglet "Reception" ? Si un tel onglet n'est pas trouvé par exemple car son nom est légèrement différent ou comporte un espace à la fin, est-ce que cette méthode renvoie 0 ou -1? Si oui, c'est peut-être la cause de ton problème.

n°1929459
tmaoptiim
Posté le 06-10-2009 à 16:43:04  profilanswer
 

Effectivement, la recherche sur l'indice sur l'onglet précédemment renommé est peut-être super-flux. Ceci dit, je doute que cela soit la cause du problème.
 
En ce qui concerne ta deuxième question, il faut que je vérifie la valeur retour de getSheetIndex("Reception" ). Aucune exception n'est levée lors de l'ouverture du fichier avec Excel 2000, Excel plante. Si j'ouvre le fichier avec un Excel 2003, Excel s'ouvre puis affiche une pop-up avec le message suivant  
 

Code :
  1. Journal de réparation de fichiers Microsoft Office Excel
  2. Des erreurs ont été détectées dans le fichier 'D:\applications\AGAPE\mails_gcp\A2A TRADING\Mail_GCP_A2A TRADING_20090923.xls'
  3. Liste des réparations :
  4. Un ou plusieurs noms non valides ont été supprimés.


Et l'onglet "Reception" a bien été supprimé.


Message édité par tmaoptiim le 06-10-2009 à 16:43:33
n°1931152
lapin21
Posté le 12-10-2009 à 11:56:50  profilanswer
 

Ne devrais-tu pas plutôt utiliser ton instance POIFSFileSystem pour écrire ton fichier ?

n°1934131
tmaoptiim
Posté le 21-10-2009 à 11:07:48  profilanswer
 

Le problème était dû à un template corrompu

n°2000745
kallou13
Posté le 11-06-2010 à 09:00:51  profilanswer
 

Utiliser un template excel pour générer un report est bien pratique Excel ce charge de la mise en forme
et POI+java permet de remplir les cellules avec les données concernées.
Selon le rapport on veut pouvoir supprimer certaines feuilles du classeur Excel "template" pour ne garder que
celles désirées par l'utilisateur final du systéme.
 
Cependant avec cette version de POI (poi-3.2-FINAL-20081019), il semble y avoir un bug, lorsque l'on supprime une feuille du classeur Excel.
 
POI se mélange les pinceaux avec les noms de plages de cellule (classe HSSFName) et supprime des plages  
non affectés à la feuille supprimé.
(Sur Excel on défini une plage de cellules par "Insertion->Nom->Définir..." )
 
La classe HSSFName permet de gérer les noms définis par l'utilisateur ainsi que la zone d'impression.
 
A noter que cette erreur ce produit également si on supprime les noms spécifiques à la feuille supprimée (cf extrait de code)
une façon de contourner le problème est de rendre la feuille invisible.
 
exemple de code qui ne marche pas bien que l'on supprime les noms associés à la feuille supprimée:

Code :
  1. for (int k=0; k<workbook.getNumberOfSheets(); k++){
  2.   String feuille = workbook.getSheetName(k);
  3.   if (StringUtils.equals(feuille, "tampon" )) continue;
  4.   boolean bSuppression = (!sommaire.isModeSommaire() && !sommaire.isFeuilleSelected(feuille)) ||
  5.           ( sommaire.isModeSommaire() && sommaire.isFeuilleInSommaire(feuille) && !sommaire.isFeuilleSelected(feuille));
  6.   if (bSuppression){
  7.    try {
  8.     workbook.setActiveSheet(k);
  9.     int nbNames = workbook.getNumberOfNames();
  10.     log.info("feuille:["+feuille+"], nbNames:["+nbNames+"]" );
  11.     for (int i=0; i<workbook.getNumberOfNames(); i++){
  12.      HSSFName name = workbook.getNameAt(i);
  13.      String sheetName = name.getSheetName();
  14.      String ref = name.getReference();
  15.      log.info("feuille:["+feuille+"], name indice:["+i+"],  ref:["+ref+"], sheetName:["+sheetName+"]" );
  16.      if (StringUtils.equalsIgnoreCase(feuille, sheetName)){
  17.       workbook.removeName(i);
  18.       i=0;
  19.      }
  20.     }
  21.    } catch (Exception ex){
  22.     // ignore this      
  23.    }
  24.    log.info("feuille:["+feuille+"] supprimée" );
  25.    workbook.removeSheetAt(k);
  26.    k--;
  27.    //wb.setSheetHidden(feuille, 2);
  28.   } else {
  29.    log.info("feuille:["+feuille+"] selectionnée" );
  30.   }
  31.  }



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  problème crash Excel 2000 après supression d'un onglet

 

Sujets relatifs
Probleme installation CodeBlocks(mingw32)Problème avec les boucles
Problème de headers dans formulaire traité en phpProblème dans la rédaction d'un petit script
Problème d' espace dans le résultat de la datePOI Excel IllegalStateException getOutputStream()
probleme installation de forum sur free[vba excel debutant] creer 1 programme en boucle
Probleme de Div et evenement (js)Probleme fopen
Plus de sujets relatifs à : problème crash Excel 2000 après supression d'un onglet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR