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

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

Marsh Posté le 05-10-2009 à 11:17:58    

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
Reply

Marsh Posté le 05-10-2009 à 11:17:58   

Reply

Marsh Posté le 05-10-2009 à 15:28:43    

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

Reply

Marsh Posté le 06-10-2009 à 09:36:34    

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.

Reply

Marsh Posté le 06-10-2009 à 16:15:34    

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.

Reply

Marsh Posté le 06-10-2009 à 16:43:04    

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
Reply

Marsh Posté le 12-10-2009 à 11:56:50    

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

Reply

Marsh Posté le 21-10-2009 à 11:07:48    

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

Reply

Marsh Posté le 11-06-2010 à 09:00:51    

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.  }


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed