J'aimerais copier les données de 3 fichiers excel, dans un seul fichier csv.
Comment faire cela en java?
Merci d'avance
J'aimerais copier les données de 3 fichiers excel, dans un seul fichier csv.
Comment faire cela en java?
Merci d'avance
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 nomComma Separated Value
![]()
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
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.
OK, merci. Je vais essayer ça. Et je te tiens au courant ou t'appelle au secours![]()
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.
Déjà je pense que tu devrais travailler en mémoire avant de vouloir écrire le fichier.
Avec ca tu devrais avoir l'essentiel des méthodes dont tu as besoin.
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);
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 ...
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
poste ton "semblant de code qui ne marche pas terrible "
+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.
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?
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
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.
Voici mon code, pour ecrire d'un fichier excel vers un fichier texte(csv).
Voilà le code, mais ça ne marche. J'ai un java.lang.NullPointerException.
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();
Merci de m'aider
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.
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 ...
+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 :
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 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part fs = new POIFSFileSystem(new FileInputStream(new File(inFilename)));
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 :
Mais ça ne m'ecrit aucun fichier csv. Pourriez vous m'aider?
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();
Merci d'avance
a une erreur dans mon code, ce n'est pas pFiles mais files pour la hash Map.
Mauvais code :
bon 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 ;
A priori, ça m'ecrit le fichier texte; je pense etre sur la bonne voie.
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 ;
Merci
ç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?
Partager