Bonjour, je viens vous demander de l'aide pour un problème que je rencontre actuellement.
J'aimerais pouvoir créer un fichier Excel à partir des données contenues dans les cellules d'un autre. Il me semble que cela est tout à fait possible, j'ai entrevu des réponses sur le Net en faisant des recherches mais rien ne me paraît vraiment solide.

J'ai déjà le code pour pouvoir récupérer les données d'une feuille excel :
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
//Création de la classe principale fenetre. 
public class fenetre extends JFrame implements ActionListener
{
	//Création de l'objet pan qui est un pannel (où l'on affiche graphiquement nos composants comme les boutons)
	private JPanel pan = new JPanel();
 
	//Création de deux objets JButton, qui seront mes deux bouton
	private JButton bouton = new JButton(" Créer un fichier ");
	private JButton bouton2 = new JButton(" Ouvrir un fichier ");
	HSSFCell cellule;
	int i = 0;
	/*Méthode main qui va créer un objet à partir de notre classe principale. Cet objet va créer un pannel
	 * graphique : une fenêtre
	 */
    public static void main(String[] args) throws Exception
    {
        fenetre fen = new fenetre(); 
    }    
 
    //Constructeur de classe, il détermine à l'aide la méthode comment sera paramétré le tout
    public fenetre()
    {  
    	//Détermine le titre de la fenêtre
    	this.setTitle("Automate Excel");
 
    	//Détermine la taille de la fenêtre
        this.setSize(550, 400);
 
        //Permet de centre la fenêtre au centre de l'écran au démarage de l'application
        this.setLocationRelativeTo(null);
 
        //Permet de stoper le processus lorsque la croix rouge est cliquée
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
        //Permet d'empêcher le redimensionnement de la fenêtre
        this.setResizable(false);
 
        //Ajoute des écoutes sur les boutons. Cela permettra d'agir lorsque les boutons seront cliqués
        bouton.addActionListener(this);
        bouton2.addActionListener(this);
 
        //Rajoute les deux boutons à notre pannel graphique
        pan.add(bouton);
        pan.add(bouton2); 
 
        //Initialisation du pannel selon les réglages indiqués au dessus
        this.setContentPane(pan);
 
        //Rend visible notre pannel (true), si le paramètre était (false) le pannel ne s'afficherait pas.
        this.setVisible(true);
    }
 
	@Override
	//Classe qui va déclencher une action lorsque les écoutes de boutons réagissent à un clique
	public void actionPerformed(ActionEvent e) 
	{
		//On déclare un objet qui contient la source du clique (bouton 1 ou 2)
		Object source=e.getSource();
 
		//Si notre objet vaut le premier bouton
		if(source==bouton)
		{
			//On lance main1()
			 try 
			 {
				CreerFichier();
			 }
			 catch (Exception e1) 
			 {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			 }
		 }
		 //sinon
		 else 
		 {
			 System.out.println("Deuxième bouton");
 
			 /*On créer un objet JFileChooser, qui va permettre à l'utilisateur de chercher sur son ordinateur le 
			 * fichier qu'il veut ouvrir
			 */
			 i = 1;
			 JFileChooser dialogue = new JFileChooser(new File("."));
			 PrintWriter sortie;
			 File fichier;
 
			 /*On créer un filtre, qui permet de voir seulement les fichiers en .csv et xls. Le filtre se nomme : 
			 * fichiers Excel
			 */
			 dialogue.addChoosableFileFilter(new FileNameExtensionFilter("fichiers Excel", "xls"));
 
			 /*On affiche alors en graphique juste les fichiers filtrés. Soit le contraire de tout accepter, donc on
			 * utilise le paramètre (false)
			 */
	    	 dialogue.setAcceptAllFileFilterUsed(false);
 
	    	 //On affiche aussi une autre sélection qui elle affiche tout les fichiers sans filtre
	         dialogue.setAcceptAllFileFilterUsed(true);
 
 
	         //Si l'utilisateur à sélectionné un fichier
			 if (dialogue.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)
			 {
				 //On créer un objet qui retient le chemin du fichier
				 fichier = dialogue.getSelectedFile();
			     try 
		  	     {
			    	 sortie = new PrintWriter
				     (new FileWriter(fichier.getPath(), true));
 
			    	  //On créer une fenêtre qui confirme à l'utilisateur le fichier qu'il a sélectionné
			    	 JOptionPane.showMessageDialog(null, "Vous avez sélectionné : " + dialogue.getSelectedFile().getPath());
 
			    	// Lecture du fichier excel
			    	 InputStream inp = new FileInputStream(fichier.getPath());
 
 
 
			    	// recupère le fichier excel
			    	 HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));
 
			    	// Recupére page 1 du fichier xls
			    	 HSSFSheet sheet = wb.getSheetAt(0);
 
			    	// nombre de ligne
			    	 int nbLigneFichier1 = sheet.getPhysicalNumberOfRows();
 
			    	 int nombreDeCelluleMax = 0;
 
			    	 for (int ligne = 0; ligne < nbLigneFichier1; ligne++) 
			    	 {
			    		 // recuperation de chaque ligne
			    		 HSSFRow row = sheet.getRow(ligne);
 
			    		 // si la ligne contient au moins une cellule
			    		 if (row != null) 
			    		 {
			    			 if (row.getPhysicalNumberOfCells() > nombreDeCelluleMax)
			    		            nombreDeCelluleMax = row.getPhysicalNumberOfCells();
			    		    }
 
			    		}
			    	 //On créer un objet POI pour pouvoir travailler dans le code le fichier ouvert par l'utilisateur
			    	 //POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fichier));
 
			    	 int nbColFichier1 = nombreDeCelluleMax;
			    	 nombreDeCelluleMax = 0;
 
			    	 // creation du tableau qui va contenir les differentes cellules
			    	 String[][] tabFichier1 = new String[nbLigneFichier1][nbColFichier1];
 
			    	 for (int ligne = 0; ligne < nbLigneFichier1; ligne++) {
			    	     HSSFRow row = sheet.getRow(ligne);
			    	     if (row != null) {
			    	         for (int colonne = 0; colonne < nbColFichier1; colonne++) {
			    	             HSSFCell cellule = row.getCell(colonne);
 
			    	                         //affichage de test
			    	                         System.out.println(cellule);
 
 
			    	         }
			    	     }
			    	 }
			    	 inp.close();
 
				 } 
			     catch (IOException e1)
			     {
			    	 // TODO Auto-generated catch block
			    	 e1.printStackTrace();
			     }
		     }
		 }		
	}
Ensuite j'ai aussi le code qui me permet de créer un nouveau fichier Excel (mais sans les données de celui ouvert auparavant... C'est là mon problème
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
public void CreerFichier() throws Exception
	{
		if (i == 0)
		{
		 // créer un nouveau fichier excel
        FileOutputStream out = new FileOutputStream("Feuille de route exemple.xls");
 
        // créer un classeur
        Workbook wb = new HSSFWorkbook();
        // créer une feuille
        Sheet mySheet = wb.createSheet("Exemple");
 
        //On créer un objet pour pouvoir créer des cellules
        Cell cell = null;
        //On créer un objet pour gèrer le style des cellules
        CellStyle cellStyle = null;
 
        //détermine la largeur des colonnes
        mySheet.setColumnWidth((short)0,(short)(15*256));
        mySheet.setColumnWidth((short)1,(short)(15*256));
        mySheet.setColumnWidth((short)2,(short)(15*256));
        mySheet.setColumnWidth((short)3,(short)(15*256));
        mySheet.setColumnWidth((short)4,(short)(15*256));
 
        // créer une ligne à la ligne 1 (0 ou la première ligne dans la feuille Excel)
        Row myRow = null;      
        myRow = mySheet.createRow(0);
 
        //Créer une ligne à la ligne 2 (1 ou la deuxième ligne) dans la feuille Excel
        Row myRow2 = null;
        myRow2 = mySheet.createRow(1);
 
        // Ajouter des données dans les cellules de la ligne 1 avec l'objet "myRow"
        cell = myRow.createCell(0);
        cell.setCellValue("Première case");
        cellStyle = wb.createCellStyle();
        cell.setCellStyle(cellStyle);
 
        cell = myRow.createCell(1);
        cell.setCellValue("Deuxième case");   
        cell.setCellStyle(cellStyle);
 
        cell = myRow.createCell(2);
        cell.setCellValue("Troisème case");
        cell.setCellStyle(cellStyle);
 
        cell = myRow.createCell(3);
        cell.setCellValue("Total additionné");
        cell.setCellStyle(cellStyle);
 
        cell = myRow.createCell(4);
        cell.setCellValue("Total multiplié");
        cell.setCellStyle(cellStyle);
 
 
        //Ajouter des données dans les cellules de la lige 2 avec l'objet "myRow2"
 
        //myRow2.createCell(0).setCellValue("1");
        cell = myRow2.createCell(0);
        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
        cell.setCellValue(1);
 
        //myRow2.createCell(1).setCellValue("2");
        cell = myRow2.createCell(1);
        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
        cell.setCellValue(2);
 
        //myRow2.createCell(2).setCellValue("3");
        cell = myRow2.createCell(2);
        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
        cell.setCellValue(20);
 
        cell = myRow2.createCell(3);
        //Le type de la cellue est "FORMULE" cela permet de mettre une formule à l'intérieur
        cell.setCellType(Cell.CELL_TYPE_FORMULA);
        cell.setCellFormula("SUM(A2:C2)");
 
        cell = myRow2.createCell(4);
        cell.setCellType(Cell.CELL_TYPE_FORMULA);
        cell.setCellFormula("PRODUCT(A2:C2)");
 
        wb.write(out);
 
        System.out.println("Ca marche");
        out.close();
		}
Le if (i == 0) est là pour que le programme réagisse différemment si un fichier a été ouvert avant.

Merci d'avance.