Bonjour,

J'adapte mon code pour qu'il lise mon fichier .xlsx.
Seulement, je rencontre cette erreur-ci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]
	at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:147)
	at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:592)
	at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:222)
	at Extraction.main(Extraction.java:155)
La ligne 155 affecté par l'erreur est en orange:

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
176
177
178
179
180
181
int nbfeuille=0;
				int ligne_trouvee;
				//version .xls
				/*InputStream ist = new FileInputStream("C:/Users/LZ2059/Desktop/Projection_2012_Eq2.xls"); //pour ouvrir les fichiers xls de 2007
				HSSFWorkbook wb2 = new HSSFWorkbook(ist);
				HSSFSheet sheet2 = wb2.getSheetAt(0);
				nbfeuille= wb2.getNumberOfSheets();//retourne le nombre de feuille renseigné
				HSSFRow row2 = null;
				HSSFCell cell2 = null;
				HSSFCellStyle cellStyle = null;*/
				
				//version .xlsx
				InputStream ist = new FileInputStream("C:/Users/LZ2059/Desktop/Projection_2012_Eq2.xlsx");
				OPCPackage opc=OPCPackage.open(ist);			    XSSFWorkbook wb2= new XSSFWorkbook(opc); 
				XSSFSheet sheet2 = wb2.getSheetAt(0);//onglet 0
				nbfeuille= wb2.getNumberOfSheets();//retourne le nombre de feuille renseigné
				XSSFRow row2 = null;
				XSSFCell cell2 = null;
				XSSFCellStyle cellStyle = null;
				XSSFDataFormat fmt = wb2.createDataFormat(); 
				//pour ouvrir un .xlsx
			    FormulaEvaluator evaluator = wb2.getCreationHelper().createFormulaEvaluator();
			    evaluator.evaluate(cell2);
				
				String prenom_proj;
				Collator usCollator;
				System.out.println("wb2.getNumberOfNames(): "+nbfeuille);
				// il faut définir la feuille qui sera alimenté:
				//Parcourir les feuilles du document
				//si la semaine correspond au libellé d'une feuille
				for (int g=0; g<nbfeuille; g++){//boucle de parcours des onglets
					sheet2 = wb2.getSheetAt(g);
					onglet=sheet2.getSheetName();// on récupère le nom de la feuille excel en String
					if(onglet.startsWith("S")){//si ca commence par "S"
						//on enleve le "S"
						semaine_en_string=onglet.substring(1);
						// on converti le nom de l'onglet en Int
						onglet_conv = Integer.parseInt(semaine_en_string);
						System.out.println("onglet: "+onglet_conv);
						if(onglet_conv == semaine){//si la semaine de l'onglet du doc "extract.xls"
													//correspond à la semaine de l'année trouver dans le fichier "Projection_2012_Eq2.xls"
						
							System.out.println("onglet de la semaine "+onglet_conv+" TROUVEE !");
							for (Iterator rowIt = sheet2.rowIterator(); rowIt.hasNext();){//boucle de parcours du fichier de ligne en ligne
								row2 = (XSSFRow) rowIt.next();
								if(row2.getCell(0)!= null && row2.getRowNum() <= 19){// si la ligne est différent de null et inférieur ou égale à la 20ème ligne
									if(!row2.getCell(0).getStringCellValue().equals("Noms") && !row2.getCell(0).getStringCellValue().equals("EQUIPE") && !row2.getCell(0).getStringCellValue().equals("")){
										//on récupère le 1er prénom du fichier Projection
										prenom_proj=row2.getCell(0).getStringCellValue().toUpperCase();
									
										for (int d=0; d<tab.length;d++){
											if(tab[0][d] != null || tab[1][d]!=null){//si l'une des cellules n'est pas null
												//System.out.println("Tab"+tab[0][d]);
												//System.out.println("prénom: "+prenom_proj);
												
												//Get the Collator for US English and set its strength to PRIMARY
												 usCollator = Collator.getInstance(Locale.FRANCE);
												 usCollator.setStrength(Collator.PRIMARY);
												 if( usCollator.compare(prenom_proj, tab[0][d]) == 0 ){//si le prénom trouvé dans le fichier 'Projection_2012_Eq2.xlsx' correspond au prenom de l'extract Hermes
												     //System.out.println("Strings are equivalent");
												     System.out.println("Agent: "+tab[0][d]+" Validation: "+tabvalidation[1][d]);
												     //on récupère la ligne du prénom
												     ligne_trouvee= row2.getCell(0).getRowIndex();
												     ligne_trouvee++;//pour écrire dans la bonne ligne
												     //System.out.println("ligne TROUVEE: "+ligne_trouvee);
												     	//on écrit dans la colonne I la validation du prénom trouvé
												     	cell2 = row2.getCell(8);// colonne(I)
													 	cell2 = row2.createCell(8);
													    cell2.setCellType(Cell.CELL_TYPE_NUMERIC);
													    cell2.setCellValue(tabvalidation[1][d]);
													    
													    //on ré-écrit la formule pour la colonne J
													    cell2 = row2.getCell(9);// colonne(J)
													 	cell2 = row2.createCell(9);
													 	cell2.setCellFormula("I"+ligne_trouvee+"/B"+ligne_trouvee);
													 	//System.out.println("Formule: I"+ligne_trouvee+"/B"+ligne_trouvee);
													 	//arrondir à 2 chiffre après la virgule
													    cellStyle = wb2.createCellStyle();
													    cellStyle.setDataFormat(fmt.getFormat("#,##0.00"));
													    cell2.setCellStyle(cellStyle);
													 	
													 	//on ré-écrit la formule pour la colonne K
													    cell2 = row2.getCell(10);// colonne(K)
													 	cell2 = row2.createCell(10);
													 	cell2.setCellFormula("I"+ligne_trouvee+"/C"+ligne_trouvee);
													 	//arrondir à 2 chiffre après la virgule
													    cellStyle = wb2.createCellStyle();
													    cellStyle.setDataFormat(fmt.getFormat("#,##0.00"));
													    cell2.setCellStyle(cellStyle);
													 	
													 	//on ré-écrit la formule pour la colonne L
													    cell2 = row2.getCell(11);// colonne(L)
													 	cell2 = row2.createCell(11);
													 	cell2.setCellFormula("J"+ligne_trouvee+"*7");
													 	//System.out.println("Formule: J"+ligne_trouvee+"*7");
													 	//arrondir à 2 chiffre après la virgule
													    cellStyle = wb2.createCellStyle();
													    cellStyle.setDataFormat(fmt.getFormat("#,##0.00"));
													    cell2.setCellStyle(cellStyle);
													 	
													 	ligne_trouvee--;//pour retrouver ma ligne
													 	// Write the output to a file
													 	//pour ecrire dans le même fichier
													    FileOutputStream fileOut = new FileOutputStream("C:/Users/LZ2059/Desktop/Projection_2012_Eq2.xlsx");
													    wb2.write(fileOut);
													    fileOut.close();
												 }
												
											}
											
										}
									}
									
								}
							}
							
							//on réécrit la formule du total colonne I
							row2.setRowNum(20);
							//System.out.println("on doit se fixer à la ligne 20: "+row2.getRowNum());
						    cell2 = row2.createCell(8);
						    String colonneI = "I3:I20";
						    cell2.setCellFormula("SUM("+colonneI+")");
						    //format EQUIPE de la colonne I
						    cellStyle = wb2.createCellStyle();
						    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));//format 1 000 par ex.
						    cell2.setCellStyle(cellStyle);
						    
						    //on réécrit la formule du total colonne J
							row2.setRowNum(20);
							//System.out.println("on doit se fixer à la ligne 20: "+row2.getRowNum());
						    cell2 = row2.createCell(9);//colonne J
						    String resultatParH = "SUM(I3:I20)/SUM(B3:B20)";
						    cell2.setCellFormula(resultatParH);
						    //arrondir à 2 chiffre après la virgule
						    cellStyle = wb2.createCellStyle();
						    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));
						    cell2.setCellStyle(cellStyle);
						    
						    //on réécrit la formule du total colonne K
							row2.setRowNum(20);
							//System.out.println("on doit se fixer à la ligne 20: "+row2.getRowNum());
						    cell2 = row2.createCell(10);//colonne K
						    String txtransfo = "(SUM(I3:I20)/SUM(C3:C20))/100";//j'ai rajouté /100 pour prendre en compte le % dans l'ecriture du format
						    cell2.setCellFormula(txtransfo);
						    //arrondir à 2 chiffre après la virgule
						    cellStyle = wb2.createCellStyle();
						    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
						    cell2.setCellStyle(cellStyle);
						    
						    //on réécrit la formule du total colonne L
							row2.setRowNum(20);
							//System.out.println("on doit se fixer à la ligne 20: "+row2.getRowNum());
						    cell2 = row2.createCell(11);//colonne L
						    String resultatetp = "J21*7";
						    cell2.setCellFormula(resultatetp);
						    //arrondir à 2 chiffre après la virgule
						    cellStyle = wb2.createCellStyle();
						    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
						    cell2.setCellStyle(cellStyle);
						    
						    //pour ecrire dans le même fichier
						    FileOutputStream fileOut = new FileOutputStream("C:/Users/LZ2059/Desktop/Projection_2012_Eq2.xlsx");
						    wb2.write(fileOut);
						    fileOut.close();
						    //System.out.println("somme colonne I: "+row2.getCell(8).get);
					}
					
					
					}
				
				}//for	
			
		} catch (FileNotFoundException e){
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InvalidFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
J'ai beau chercher je trouve pas comment faire?