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 :

Ecrire un fichiers CSV à partir de 3 fichiers Excel


Sujet :

Documents Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut Ecrire un fichiers CSV à partir de 3 fichiers Excel
    J'aimerais copier les données de 3 fichiers excel, dans un seul fichier csv.

    Comment faire cela en java?

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Deja lire les fichiers Excel
    Apache Jakarta POI peut faire ca.

    Ecrire le cvs qui n'est qu'un fichier texte séparé par des virgules ...
    d'ou le nom Comma Separated Value

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Merci pour ta réponse, mais étant débutant je n'ai pas très bien compris comment faire. Je suis allé sur le site de jakarta, j'ai lu la doc sur POI, mais je t'avoue que je trouve ça un peu difficile.

    Tu n'aurais pas un exemple à me donner, pour m'inspirer de ton code.

    Merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Héhé, j'avoue que je n'ai pas codé un tel projet

    Pour Excel l'extension correspondante est HSSF
    Regarde la doc correspondant à ce morceau.

    Avec Jakarta tu auras de quoi lire un fichier XLS, retrouver les données dans tes cellules, et tout ca ...

    Ensuite en Java il suffit de te faire une ptite structure qui correspondent à ce que tu veux faire, genre des tableaux de chaines pour stocker venant des différents fichier excel.

    Puis la génération des fichiers elle se fait avec les classes de Writer, sur le site developpez.com y aura certainement de quoi faire ton bonheur la dessus.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    OK, merci. Je vais essayer ça. Et je te tiens au courant ou t'appelle au secours

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Je viens d'essayer de comprendre mais c'est pas evident POI.
    Je dois copier des colonnes de ma source pour les ecrire vers le fichiers destination, mais je ne sais pas comment faire.

    je n'y arrive pas.

    Aidez moi s'il vous plait.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Déjà je pense que tu devrais travailler en mémoire avant de vouloir écrire le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        POIFSFileSystem fs      =
                new POIFSFileSystem(new FileInputStream("workbook.xls"));
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFRow row = sheet.getRow(2);
        HSSFCell cell = row.getCell((short)3);
    Avec ca tu devrais avoir l'essentiel des méthodes dont tu as besoin.
    Le POIFSFileSystem correspond à ton fichier XLS.
    Workbook c'est la représentation du classeur excel.
    Sheet correspond à chacune des feuilles.
    Row c'est les colonnes.
    Cell les cellules.

    Tes données tu peux les récup avec une série de boucles ...

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    OK, je commence à avoir un semblant de code, mais ça marche pas terrible, surtout quand y a des cellules vides sans rien.

    Je seche là. Y a t-il un expert Java-POI qui pourrait etre charitable, et me donner un coup de pouce.

    Merci d'avance

  9. #9
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    poste ton "semblant de code qui ne marche pas terrible "


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    +1

    Et de plus, ca veut dire quoi "ca marche pas terrible ?"
    Il te saute des cellules ?
    Il ne récupère pas les bonnes valeurs ?
    Il n'ouvre pas ton fichier ?

    Plus tu seras précis plus on pourra t'aider.

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    En fait dans mon fichier excel, il y a certaines cellules qui sont vides, et pour ces cellules mon code ne fonctionne pas, il recupere aucune cellule de la colonne considérée.
    Du coup j'aimerais faire une copie d'un ensemble de cellules pour les coller dans un nouveau fichier mais je ne sais pas comment faire ou si une telle action est possible avec POI.

    Comment faire?

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Mais je comprends pas ... Y te refuse l'accès à une colonne, parce que certains éléments sont vides ... Ca parait bizarre ...
    Y a pas un getColonne ou un truc dans le style ?

    Copier un ensemble de cellule c'est possible, avec une boucle de getCell a priori ...

    La si tu n'es pas plus précis et sans envoyer de code, on pourra difficilement faire quelque chose ...

    Tout ceci reste très vague

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Mon soucis est effectivement de copier toutes les données d'un fichier excel vers un fichier csv avec comme separateur le point virgule.
    Comment faut il faire?
    Je sais qu'il faut un PrintWriter, mais que faut-il d'autres? Est ce quelqu'un aurait un exemple de code?

    Merci.

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Voici mon code, pour ecrire d'un fichier excel vers un fichier texte(csv).

    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
     
     
        String sFile = sFile = "mon_excel.xls";
        String repertoire = "C:\\excel\\";
        String inFilename = repertoire + sFile ;
        String outFilename = repertoire + "Essai.csv";
        POIFSFileSystem fs = null;
        FileOutputStream file = null;
        FileOutputStream fileOut = null;
        HSSFWorkbook workbook = null;
        HSSFSheet sheet = null;
        HSSFCell cel = null;
        String value = null;
        PrintWriter oot = null;
        StringBuffer buf = null;
        fs = new POIFSFileSystem(new FileInputStream(new File(inFilename)));
        workbook = new HSSFWorkbook(fs);
        sheet = workbook.getSheetAt(0);
        fs = new POIFSFileSystem(new FileInputStream(new File(inFilename)));
        fileOut = new FileOutputStream(new File(outFilename));
        oot = new PrintWriter(fileOut);
        buf = new StringBuffer();
        workbook = new HSSFWorkbook();
        int nbRow = sheet.getPhysicalNumberOfRows();
     
        for(int i = 0 ; i < nbRow ; i++) {
            HSSFRow row = sheet.getRow(i);
            buf.setLength(0);
            // 100 cellules
            for(short j = (short) 0 ; j <= (short) 100 ; j++) {
                buf.append(
                        null == row.getCell(j).getStringCellValue().toString() ? "" : 
    	    row.getCell(j).getStringCellValue().toString());
                if(j != 100) {
                    buf.append(";");
                }
            }
            buf.append("\n");
            oot.println(buf.toString());
     
        }
        oot.flush();
        oot.close();
        fileOut.close();
    Voilà le code, mais ça ne marche. J'ai un java.lang.NullPointerException.

    Merci de m'aider

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    Sans rien connaitre à POI, je dirais que les causes possibles d'un NullPointerException sont
    • row.getCell(j) est null, ou
    • row.getCell(j).getStringCellValue() est null.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Un NullPointer ca se detecte relativement facilement ...
    T'as essayé de débugguer ton code, tu sais où il apparait le null ?
    T'as fait des prints, t'as essayé des exécutions pas à pas ?

    Un pti tour vers les cours / tutoriels de débug ne seraient pas de trop non plus à priori ...

  17. #17
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    +1

    pour pk960, en ce qui concerne les causes probables du NullPointerException.
    de plus quel est l'intérêt de répéter deux fois cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fs = new POIFSFileSystem(new FileInputStream(new File(inFilename)));
    Il doit s'agir à mon avis d'un copier coller malheureux. Et il est préférable d'enlever la deuxième occurrence qui n'apporte rien !
    Les deux principales inventions sorties de Berkeley sont UNIX et le LSD. Difficile de croire à une quelconque coïncidence - Jeremy S. Anderson

    Avant de vouloir qu’un logiciel soit réutilisable, il faudrait d’abord qu’il ait été utilisable - Ralph Johnson

  18. #18
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    OK, merci à tout le monde. En fait, je dois faire un controle sur le type de la cellule en cours(string, numeric, formula, blank).
    Je fais des tests sur un fichier excel et ça marche.
    Par contre pour dans un fichier csv, avec plusieurs fichiers excel en entrée, j'ai encore des soucis. Est ce que je dois utiliser une HashMap pour stocker mes 3 fichiers excel?

    Voici le code que j'ai crée :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    HashMap pFiles = new HashMap(3);
    ArrayList sheets = new ArrayList();
    String fichierTraite = null;
    UploadFile fileDest = null;
    String sFile = null, sFile1, sFile2, sFile3 = null;
    String inFilename = null;
    String outFilename = null;	
    HashMap files = new HashMap();
     
    sFile1 = "test1.xls";
    sFile2 = "test2.xls";
    sFile3 = "test2.xls";
     
    files.put(new Integer(0),sFile1);
    files.put(new Integer(1),sFile2);
    files.put(new Integer(2),sFile3);
     
    String repertoire = "C:\\data\\excel\\";
     
     
    outFilename = repertoire + "test_essai.csv";
     
    POIFSFileSystem fs = null;
    FileOutputStream fileOut = null;
    HSSFWorkbook workbook = null;
    HSSFSheet sheet = null;
    PrintWriter oot = null;
    StringBuffer buf = null;
    String sType = null;
    String cellValue = null;
    HSSFRow row = null;
    fileOut = new FileOutputStream(new File(outFilename));
    oot = new PrintWriter(fileOut);
    buf = new StringBuffer();
    int nbRow = 0;
     
      for(int k = 0 ; k < pFiles.size() ; k++) {
     
      sFile = (String) files.get(new Integer(k));
      inFilename = repertoire + sFile ;
     
      fs = new POIFSFileSystem(new FileInputStream(new File(inFilename)));
      workbook = new HSSFWorkbook(fs);
      sheet = workbook.getSheetAt(0);
      nbRow = sheet.getPhysicalNumberOfRows();
     
      for(int i = 0 ; i < nbRow ; i++) {
        row = sheet.getRow(i);
        buf.setLength(0);
     
        for(short j = (short) 0 ; j <= (short) 52 ; j++) {				
          if(row.getCell(j) != null) {
            switch(row.getCell(j).getCellType()) {
    	  case HSSFCell.CELL_TYPE_BLANK :
    	    cellValue = "";
    	    break;
    	  case HSSFCell.CELL_TYPE_FORMULA :
    	    cellValue = row.getCell(j).getCellFormula();
    	    break;
    	  case HSSFCell.CELL_TYPE_NUMERIC :
    	    double iValue = row.getCell(j).getNumericCellValue();
    	    cellValue = String.valueOf(iValue);
    	    break;
    	  case HSSFCell.CELL_TYPE_STRING :
    	    cellValue = row.getCell(j).getStringCellValue();
    	    break;
    	  default :
    	}
     
    	buf.append(cellValue);
     
    	  if(j < 52)
    	  buf.append(";");
        }
     
      }
     
      buf.append("\r");
      oot.println(buf.toString());
     
    }
    }
    oot.flush();
    oot.close();
    fileOut.close();
    Mais ça ne m'ecrit aucun fichier csv. Pourriez vous m'aider?
    Merci d'avance

  19. #19
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    a une erreur dans mon code, ce n'est pas pFiles mais files pour la hash Map.

    Mauvais code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int k = 0 ; k < pFiles.size() ; k++) { 
     
      sFile = (String) files.get(new Integer(k)); 
      inFilename = repertoire + sFile ;
    bon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int k = 0 ; k < files.size() ; k++) { 
     
      sFile = (String) files.get(new Integer(k)); 
      inFilename = repertoire + sFile ;
    A priori, ça m'ecrit le fichier texte; je pense etre sur la bonne voie.
    Merci

  20. #20
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    ça ne marche pas, ça m'execute une boucle infinie, en parsant les cellules vides dans mon fichier excel, c'est bizarre. Du coup ça plante mon serveur. Je n'arrive pas à voir comment faire pour eviter ça. Comment faire?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2008, 14h51
  2. Réponses: 0
    Dernier message: 07/02/2008, 16h09
  3. Réponses: 3
    Dernier message: 03/01/2008, 12h14
  4. Créer un fichier CSV à partir d'un recordset
    Par mouaa dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/07/2007, 14h40
  5. Fichier CSV à partir un programme C
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 25/05/2006, 23h53

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