Bonjour,

J'arrive très bien à crée un onglet (feuille) Excel en y déversant des données provenant d'une Table Oracle via l'API-Apache.

Mais je n'arrive pas à rajouter un 2éme Onglet (feuille) Excel dans ce même classeur.

Voici mon code :

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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
 
 
    // OPération qui va charger l'Objet JAVA à partir d'une table
    // Le nom long du fichier entête en entrée devra ressembler à : "src/EntetesOngletsExcel/EnteteSyntheseMoniteurDeFlux.txt"
    // Le nom long du fichier Excel en sortie devra ressemblé à :
    // "C:/TEMP/referentiel/excel/2021-02-23-Mise_a_jour_referentiel_des_flux_Tests22-sortie.xls"
    // Le libellé de la requête doit ressembler à : "# Recuperation des champs de la table TB_SyntheseMoniteurDeFlux"
    public void chargementFichierExcelAPartirDUneTable(String e_nomLongFichierContenantUneEntete, String e_nomLongFichierExcelEnSortie,
            String e_libelleDeLaRequete) {
 
        // Déclaration ds variable locale
        OngletExcel l_ongletExcel = new OngletExcel();
        Fichiers l_fichiers = new Fichiers();
        RequetesHybrides l_requetesHybrides = new RequetesHybrides();
 
        Object[][] l_corpsDuTabeleau = null;
        String[] l_enteteDuTableau = null;
        List<String[]> l_listeContenuDeLaTableRelationnel = new ArrayList<String[]>();
        List<String[]> l_listeContenuDuFichierCSV = new ArrayList<String[]>();
 
        String l_nomDeLaBase = new String("NFF10");
        String l_laRequete = null;
        String l_suiteNomColonneDeLatable = null;
        String l_nomDeLOnglet = null;
        String c_pointVirgule = new String(";");
 
        // La seul chose qui nous interesse ici, c'est de récupérer la première ligne de ce fichier
        // en effet cette première ligne contient le descriptif du fichier que l'on souhaite injecter
        // dans Excel Finale.
        // On aurait très bien pu prendre aussi moniteursPasDansGIFTPreProduction.csv qui
        // contient la même description
        // String l_fichierContenatUneEntete = new String("src/EntetesOngletsExcel/EnteteSyntheseMoniteurDeFlux.txt");
        String[] l_tableauValeurColonne = null;
 
        GestionDuStyle l_gestionDuStyle = new GestionDuStyle();
 
        File l_fichier = null;
 
        FileOutputStream l_fileOutputStream = null;
        HSSFWorkbook l_classeur = null;
        CellStyle[] l_tableauStyleDeCellule = new CellStyle[3];
 
        int l_nombreDeColonne = 0;
        int l_nombreDeligne = 0;
        int l_positionChaineDeCaractere = 0;
 
        try {
 
            // Suppression du fichier en sortie s'il existait au préalable
            // l_fichiers.suppressionDUnFichier(e_nomLongFichierExcelEnSortie);
 
            // Récupération de la requête de lecture de la table TB_Synthese...
            l_laRequete = l_fichiers.recuperationRequeteDansFichierTexte("src/requetesSQL/RequetesSynthese.txt", e_libelleDeLaRequete);
 
            // System.out.println("La requête est : " + l_laRequete);
 
            l_listeContenuDeLaTableRelationnel = l_requetesHybrides.recuperationDeDonneesAPartirDuneBase(l_laRequete, l_nomDeLaBase);
 
            // récupération du nombre de ligne de la table TB_SyntheseMoniteurDeFlux
            l_nombreDeligne = l_listeContenuDeLaTableRelationnel.size();
 
            // récupération du nombre de colonne à partir du fichier de la description des entête
            l_suiteNomColonneDeLatable = l_fichiers.lectureDUnFichiers(e_nomLongFichierContenantUneEntete);
 
            l_tableauValeurColonne = l_suiteNomColonneDeLatable.split(Pattern.quote(c_pointVirgule));
 
            l_nombreDeColonne = l_tableauValeurColonne.length;
 
            // Instantiation de l'objet l_corpsDuTabeleau
            l_corpsDuTabeleau = new Object[l_nombreDeligne][l_nombreDeColonne];
 
            // Instantiation de l'objet l_corpsDuTabeleau
            l_enteteDuTableau = new String[l_nombreDeColonne];
 
            // réinitialisation du tableau de valeur de colonne
            for (int i = 0; i < l_tableauValeurColonne.length; i++) {
                l_tableauValeurColonne[i] = null;
            }
 
            // Remplissage du tableau Objet à double entrée
            for (int i = 0; i < l_listeContenuDeLaTableRelationnel.size(); i++) {
 
                l_tableauValeurColonne = l_listeContenuDeLaTableRelationnel.get(i);
 
                for (int j = 0; j < l_tableauValeurColonne.length; j++) {
 
                    // System.out.println("La valeur est : " + l_tableauValeurColonne[j]);
 
                    // Dans le cas ou la vaelur du champ est null, mettre rien ("") à la place
                    if (l_tableauValeurColonne[j] == null) {
                        l_tableauValeurColonne[j] = "";
                    }
 
                    l_corpsDuTabeleau[i][j] = l_tableauValeurColonne[j];
                }
            }
 
            l_ongletExcel.setaCorpsDuTabeleau(l_corpsDuTabeleau);
 
            l_listeContenuDuFichierCSV = l_fichiers.chargementFichierCSVDansUneListe(e_nomLongFichierContenantUneEntete);
 
            // Seule la première ligne du fichier () nous interesse
            l_enteteDuTableau = l_listeContenuDuFichierCSV.get(0);
 
            l_ongletExcel.setaEnteteDuTableau(l_enteteDuTableau);
 
            System.out.println("Le nom du fichier est : " + e_nomLongFichierExcelEnSortie);
 
            l_fichier = new File(e_nomLongFichierExcelEnSortie);
 
            // Le booleen true est important c'est lui qui permet d'écrire à la suite des données enregistrées sans les écraser
            // l_fileOutputStream = new FileOutputStream(e_nomLongFichierExcelEnSortie, true);
            l_fileOutputStream = new FileOutputStream(l_fichier, true);
 
            if (l_fichier.exists() && l_fichier.length() != 0) {
 
                System.out.println("Le fichier : " + e_nomLongFichierExcelEnSortie + " existe et n'est pas vide");
 
                l_classeur = (HSSFWorkbook) WorkbookFactory.create(l_fichier);
            } else {
 
                System.out.println("Le fichier : " + e_nomLongFichierExcelEnSortie + " N'existe PAS");
 
                l_classeur = new HSSFWorkbook();
            }
 
            // Valorisation du style de la cellule pour l'entete
            l_tableauStyleDeCellule[0] = l_gestionDuStyle.styleGris(l_classeur);
 
            // Valorisation du style de la cellule en bleu clair pour le corps du tableau
            l_tableauStyleDeCellule[1] = l_gestionDuStyle.styleBleuClair(l_classeur);
 
            // Valorisation du style de cellule standard (blanc) pour le corps du tableau
            l_tableauStyleDeCellule[2] = l_gestionDuStyle.styleStandard(l_classeur);
 
            // Recupération de la position de la chaine de caractere "TB_"
            // l'idée étant de recupérer le nom de la table (ou de l'onglet, c'est la même chose)
            l_positionChaineDeCaractere = e_libelleDeLaRequete.indexOf("TB_");
 
            l_nomDeLOnglet = e_libelleDeLaRequete.substring(l_positionChaineDeCaractere);
 
            System.out.println("Le nom de l'onglet est : " + l_nomDeLOnglet);
 
            l_classeur = l_ongletExcel.dechargementObjetJavaDansOngletExcel(l_classeur, l_nomDeLOnglet, l_tableauStyleDeCellule);
 
            l_classeur.write(l_fileOutputStream);
            l_classeur.close();
            l_fileOutputStream.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
    // Opération qui a partir du nom d'un classeur, d'un nom d'onglet et d'un tableau de style en entrée
    // charge un onglet Excel. Au préalable il aura bien évidement chargé la matrice d'objet à l'aide de l'opération
    // chargementTableauExcelDansObjetJava
    public HSSFWorkbook dechargementObjetJavaDansOngletExcel(HSSFWorkbook e_classeur, String e_nomDOnglet, CellStyle[] e_tableauStyleDeCellule) {
 
        // déclaration des variables locales
        Sheet l_onglet = null;
        Row l_ligne = null;
        String l_valeur = null;
        String l_titreDeLaColonne = null;
        int l_longeurDuTitre = 0;
 
        Cell l_cellule = null;
        GestionDuStyle l_gestionDuStyle = new GestionDuStyle();
        CellStyle l_styleDeLaCellule = null;
 
        // if (this.getaDernierNomDeFichier().compareTo(e_nomDeFichier) != 0) {
        // this.setaDernierNomDeFichier(e_nomDeFichier);
        // }
 
        System.out.println("Philippe5 - Le nom de l'onglet est : " + e_nomDOnglet);
 
        // if (!e_nomDOnglet.equals(this.getaDernierNomDOnglet())) {
        // this.setaDernierNomDOnglet(e_nomDOnglet);
        // }
 
        // Pour test
        // this.setaDernierNomDOnglet("TB_SyntheseFluxMontant");
 
        // System.out.println("Philippe5 - Le dernier nom d'onglet est : " + this.getaDernierNomDOnglet());
 
        // e_classeur.removeSheetAt(1);
        l_onglet = e_classeur.createSheet(e_nomDOnglet);
        // l_onglet = e_classeur.getSheetAt(1);
 
        System.out.println("Le nombre d'onglet dans le classeur est : " + e_classeur.getNumberOfSheets());
 
        System.out.println("Le nom de l'onglet  d'ordre 0 est :  " + e_classeur.getSheetName(0));
        // System.out.println("Le nom de l'onglet d'ordre 1 est : " + e_classeur.getSheetName(1));
 
        System.out.println("L'index de l'onglet courant est :  " + e_classeur.getSheetIndex(l_onglet));
 
        l_ligne = l_onglet.createRow(0);
 
        // boucle sur les colonnes de l'entête
        for (int i = 0; i < this.getaEnteteDuTableau().length; i++) {
            l_ligne.createCell(i).setCellValue(this.getaEnteteDuTableau()[i]);
 
            l_cellule = l_ligne.getCell(i);
 
            // Pour l'entête le style de la cellule sera gris.
            l_cellule.setCellStyle(e_tableauStyleDeCellule[0]);
 
            // redimensionnemet de la colonne en fonction de la valeur qui se trouve dans la cellule
            // l_onglet.autoSizeColumn(i);
 
            // Recuperation du libelle de la colonne
            l_titreDeLaColonne = l_cellule.getStringCellValue();
 
            System.out.println("Philippe - Le nom de la colonne est : " + l_titreDeLaColonne);
 
            // Recuperation de la longueur du libellé
            l_longeurDuTitre = l_titreDeLaColonne.length();
 
            // Dimensionnement de la cellule qui corespondra à la longueur du liellé + 3 caractères
            // pour prévoir la place de la flèche de filtre qui est à droite de la cellule
            l_onglet.setColumnWidth(i, ((l_longeurDuTitre + 3) * 256));
        }
 
        // System.out.println("Je suis au début du traitement du corps du fichier");
 
        // boucle sur les lignes corps
        for (int j = 0; j < this.getaCorpsDuTableau().length; j++) {
 
            l_ligne = l_onglet.createRow(j + 1);
 
            // Si le n° de ligne est impaire, collorer la ligne en bleu
            if (j % 2 != 0) {
                // Valorisation du style de la cellule en bleu clair pour le corps du tableau
                l_styleDeLaCellule = e_tableauStyleDeCellule[1];
            } else {
                // Valorisation du style de cellule standard (blanc) pour le corps du tableau
                l_styleDeLaCellule = e_tableauStyleDeCellule[2];
            }
 
            // boucle sur les colonnes de corps
            for (int i = 0; i < this.getaCorpsDuTableau()[j].length; i++) {
 
                l_valeur = String.valueOf(this.getaCorpsDuTableau()[j][i]);
                l_ligne.createCell(i).setCellValue(l_valeur);
 
                l_cellule = l_ligne.getCell(i);
                l_cellule.setCellStyle(l_styleDeLaCellule);
 
            }
        }
 
        // Rajout de filtre sur chaque colonne de l'entête du tabelau Excel
        l_onglet = l_gestionDuStyle.rajoutFiltreSurEnteteDeColonne(l_onglet);
 
        return e_classeur;
    }

Globalement le 1er onglet se crée bien, mais lorsque je tente d'inserer un 2éme onglet, le programme ne plante pas, mais il ne se passe rien .... Pas de 2éme onglet crée dans le classeur.

Est ce que quelqu'un aurait une idée ?

Par avance merci.

Bien à vous.