Pour info, l'api JExcel est super simple.
10 minutes pour comprendre le fonctionnement, avec en plus un super tutoriel integré au zip de l'api (bon, en anglais, mais relativement clair).
En gros, pour modifier un fichier Excel existant, on fait une copie que l'on peut nommer comme on le souhaite, et on modifie la copie.
public class TestExcel { public static void main(String[] args) { try { Workbook workbook = Workbook.getWorkbook(new File("de.xls"));//fichier source WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"), workbook);//copie du fichier source WritableSheet sheet2 = copy.getSheet(0);//on travail sur la feuile n°1 WritableCell cell = sheet2.getWritableCell(6, 1);//numero de cellule (6,1) = (G,2) if (cell.getType() == CellType.LABEL)//si le type de cellule est non-numérique (String) { String content = cell.getContents(); System.out.println("contenu actuel :"+ content); Label lab = (Label) cell; lab.setString("Test de moification"); } else { System.out.println("echec d'ecriture :"+cell.getType()); } copy.write(); copy.close(); System.out.println("Action terminée"); } catch(IOException e) { System.out.println(e); } catch(WriteException e) { System.out.println(e); } catch(BiffException e) { System.out.println(e); } } }
Hors ligne
Bien joué Papy.
Par contre pourquoi tu fais pas un catch(Exception e) ca t'eviterais de tapper 50 fois la mm chose?
Hors ligne
yoda a écrit:
Bien joué Papy.
Par contre pourquoi tu fais pas un catch(Exception e) ca t'eviterais de tapper 50 fois la mm chose?
Parce que j'ai enlevé les instructions que j'effectue selon l'exception levée dans le code que j'ai posté.
Mais on peut effectivement rassembler les exceptions dans un seul catch.
Hors ligne
non laisse comme cela, c'est plus clair et plus dans l'idée objet de lever une exception specifique, enfin c'est mon avis
Hors ligne
Ha, le combat des chefs va commencer....FIGHT !!!!
Hors ligne
Bonjour tout le monde je suis un petit nouveau
Je suis actuellement en stage et je travaille sur la migration de eSpreadSheet vers POI ou JExcel.
Avant de pouvoir migrer je dois vérifier certains points prérequis, et la je cale.
Alors mon problème, sur Excel on peut "breaker" une cellule en rajoutant une apostrophe devant sa saisie, exemple : 'exemple.
Mon problème arrive quand je veux récupérer une date breakée ('26/09/06 ou '26 déc 2006 ...) le type de la cellule m'interdit de récupérer la cellule en tant que DateCell, car c'est une LabelCell.
Donc j'essaye de faire un bricolage, pour copier cette cellule sur une autre feuille Excel pour me débarasser de l'appostrophe et retrouver le bon type mais cela ne fonctionne pas.
La solution idéal serait un moyen de faire reconnaître par Excel le format date automatiquement via la "Barre de formule".
Si jamais quelqu'un à une solution je suis tout ouïe.
Merci par avance
Louis
Hors ligne
J'ai trouvé une solution : j'utilise une fonction d'Excel : DATEVAL() qui à partir d'une date au format string, l'interprète, et donne une date au format Excel : un double. Puis j'utilise la fonction HSSFDateUtil.getJavaDate( ) pour la conversion au format Java.
Le petit problème c'est que je triche un peu, j'utilise une formule présaisie sur une feuille Excel car je n'arrive pas a en rentrer une moi même : cell.setCellFormula("DATEVAL(A1)").
En tout cas ca marche, mais si quelqu'un a une idée pour la saisie de formule je lui en serai très reconnaissant.
Louis
Hors ligne
Je pense que tu te compliques la vie...
A moins que tes celules sur le fichier Excel soit de type "Date", il suffit de récuperer sous un type String le contenu de tes cellules du fichier Excel.
C'est seulement ensuite que tu peux caster tes String en Date, ou Util.Date, etc... ou faire toute les modifications de formes que tu veux à tes String, comme éliminer ou ajouter une apostrophe, ou changer la synthaxe, etc.
Dernière modification par papy (23-02-2006 21:23:40)
Hors ligne
En fait j'y ai pensé à ça, le problème c'est que je veux les dates aux formats acceptés par Excel. Si je parse ou caste mes dates avec Java je ne suis pas sur qu'en entrée j'ai une date au format Excel. Je dois par exemple ignorer le type de date dd.mm.yyyy.
En fait cet exemple n'est pas parlant car java n'accepte pas ce format non plus. Par contre sous la forme dd/mm/yyyy java ne l'accepte pas.
En tout cas merci pour la réponse
Hors ligne
Finalement : je n'ai pas le droit d'utiliser un autre document Excel, donc ma solution d'écrire dans un autre fichier c'est pas la peine. Il faudrait idélament pouvoir ouvrir le fichier Excel en lecture/ecriture pour pouvoir faire des modifications directement dessus mais ce n'est pas possible.
Donc je vais tout récupérer en string et faire du parsing en Java. Trop super.
Hors ligne
salut louis, on dirait que tout le monde est en vacances ici
Pour ma part, je n'ai pas touché à excel et à java depuis ma licence, mon aide ne sera pas tres précieuse
Edit: j'ai rien dit, papy est tjrs la
Hors ligne
louis a écrit:
Par contre sous la forme dd/mm/yyyy java ne l'accepte pas.
??
Il suffit d'indiquer la synthaxe de tes dates à ton parser de format...
SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy" ); Date date_parsee = sdf.parse(date_en_String); //commentaire:date_parsee = Objet de type Date
Hors ligne
Ou encore, si tu souhaite utiliser un objet de type Date en entrée :
SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy" ); Date date_parsee = sdf.parse(sdf.format(la_date_de_type_Date));
Dernière modification par papy (25-02-2006 19:55:42)
Hors ligne
Oui en fait en faisant des recherches j'avais vu ca Moi je passais par le parser du constructeur de Date().
Bon maintenant il faut que je m'attarde sur tous les formats de dates d'Excel pour pouvoir les parser .
Louis
Hors ligne
Je me suis fait un tit parser maison avec les Regex
// On définit alors 3 Regex que l'on compile Pattern type1 = Pattern.compile("^((0?[1-9])|(1\\d)|(2\\d)|(3[0-1]))\\/((0?[1-9])|(1[0-2])|([a-z_é]{3,9}))\\/(([0-9][0-9])|([1-2]\\d\\d\\d))$"); Pattern type2 = Pattern.compile("^((0?[1-9])|(1\\d)|(2\\d)|(3[0-1]))\\-((0?[1-9])|(1[0-2])|([a-z_é]{3,9}))\\-(([0-9][0-9])|([1-2]\\d\\d\\d))$"); Pattern type3 = Pattern.compile("^((0?[1-9])|(1\\d)|(2\\d)|(3[0-1]))(\\s)([a-z_é]{3,9})(\\s)(([0-9][0-9])|([1-2]\\d\\d\\d))$"); //On va également définir 3 moteurs de recherches Matcher matchT1 = type1.matcher(chaine); Matcher matchT2 = type2.matcher(chaine); Matcher matchT3 = type3.matcher(chaine); //On regarde les résultats boolean resT1 = matchT1.find(); boolean resT2 = matchT2.find(); boolean resT3 = matchT3.find();
Par la suite je fais du bricolage un peu sur les mois, et finalement en fonction du séparateur (/, - ou espace) je fais un tit SimpleDateFormat. Et voilou
Mais bon j'ai l'impression de réinventer la roue.
Dernière modification par louis (27-02-2006 15:00:43)
Hors ligne
louis a écrit:
Mais bon j'ai l'impression de réinventer la roue.
Difficile de te répondre car je ne sais pas vraiment ce que tu veux faire !
Les dates de ton fichier excel ne sont pas formatées ?
Elles peuvent être différentes ?
...je ne vois pas le pourquoi de tes expressions régulières en fait...
Hors ligne
En fait sur mon fichier excel j'ai différent format de date : dd/mm/yy, dd-mm-yy, ddmmyyyy ...
Les dates rentrées par l'utilisateur peuvent être breakées (avec une ' devant la date ex : '25/05/06) ce qui fait que la date n'est pas reconnu, et que le type de la cellule est considéré comme String.
Cela ne permet pas à Excel d'interpréter lui même la date, je dois donc le faire. D'où l'idée d'un parser, qui ne sert on va dire qu'à repérer les séparateur et le format de la date (pas reconnu par Excel dans ce cas là).
Ensuite j'utilise les objets java pour les dates pour finir le travail.
Voila
Hors ligne
Petite question bonus,
pourquoi le fichier excel n'est pas uniformisé avant de le parser? Parceque bon c'est bien de tout anticiper mais si l'utilisateur s'appele boulet il a qu'à écriré 27Fev2005 du temps qu'on y est.
S'il sait deja qu'il faut saisir la date sur un certain format c'est deja l'essentiel non?
Bon j'ai compris, je sors -->[]
Hors ligne
Le truc c'est que le fichier Excel est créé par différentes entreprises, donc ça ne dépend même pas de nous. Il faut juste que nous le traitions rapidement.
Hors ligne
Ok c'etait juste la question du jour, ne connaissant pas le contexte je ne voyait pas l'intéret de se casser la tête sur un format de date.
Par contre je ne suis pas le spécialiste des regex mais elles sont pas un peu longues la?
Hors ligne
Elle me permet de prendre en compte les jours de (0)1 à 31 les mois de (0)1 à 12 ou en lettre (je fais la vérification après) et les années sur 2 ou 4 chiffres.
Avec différents séparateurs
Dernière modification par louis (28-02-2006 14:15:02)
Hors ligne
yoda a écrit:
Petite question bonus...
Mes hommages mon maitre...
Hors ligne
Lol Papy, au niveau java je ne pense plus bien être le maitre de quoi que ce soit vu le temps depuis lequel j'en ai pas fait mais bon de l'objet reste de l'objet :p
sinon ok pour tes regex par contre tu n'a aucun moyen de verifier si le gars tape 31/02/2006 mais bon il faut quand même un minimum de discipline chez l'utilisateur (aussi si l'utilisateur saisi 02-18-06:format US là tu peux rien faire) ;-)
C'est quand même tordu les dates quand tu peux rien imposer aux utilisateurs :p
Donc bon courage et j'espère que tout merchera comme tu l'as préparé(mais vive la formation des utilisateurs :p)
Hors ligne
Normalement je ne reçois que du format français. Pour la concordance au niveau Jour/Mois simpleDateFormat traduit un 30/02/06 en 02/03/06. Donc au pire ce que je peux faire c'est comparer le jour d'entrée et de sortie, et indiquer une erreur
Sinon faire ca à la main, je l'avais fait l'année dernière pour une application de gestion des congés.
Hors ligne
Bonjour,
Je débute en java et j'ai un peu de mal.
Je dois récupérer des données d'un fichier xls.
J'ai bien vu comment faire pour récupérer les données d'une cellule, mais comment fait-on pour récupérer toutes les données de la feuille, lorsqu'on ne sait pas commbien de ligne et de colonne on a ?
Merci de votre aide
Audrey
Hors ligne