Bonjour,
Lorsque l'on exporte son rapport en XLS, selon la structure de l'entete et pied de page définit dans le master page, celui-ci est soit inséré dans la feuille de calcul, soit mappé sur l'entête et pied de page excel. Jusque là tout va bien.
Un petit saut dans le code source de BIRT (2.5.2) nous donne les conditions pour apparaitre dans l'entete et pied de page excel :
- Dimension de la grille : 1 ligne et 3 colonnes max ;
- pas d'html ;
- pas de grille imbriquée ;
Code Java : 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 public boolean needOutputInMasterPage( IContent headerFooter ) { if ( headerFooter != null ) { Collection list = headerFooter.getChildren( ); Iterator iter = list.iterator( ); while ( iter.hasNext( ) ) { Object child = iter.next( ); if ( child instanceof ITableContent ) { int columncount = ( (ITableContent) child ).getColumnCount( ); int rowcount = ( (ITableContent) child ).getChildren( ).size( ); if ( columncount > 3 || rowcount > 1 ) { logger.log(Level.WARNING,"Excel page header or footer only accept a table no more than 1 row and 3 columns." ); return false; } if ( isEmbededTable( (ITableContent) child ) ) { logger.log( Level.WARNING,"Excel page header and footer don't support embeded grid." ); return false; } } if ( isHtmlText( child ) ) { logger.log( Level.WARNING,"Excel page header and footer don't support html text." ); return false; } } } return true; }
OK jusque là c'est compréhensible ; BIRT mappe chaque cellule de la grille dans une zone de l'entete (ou pied de page) excel. Pour info, l'entete (ou pied de page) excel prévoit 3 zones éditables : gauche, centre, droite de tailles identiques.
En résumé, en théorie, il suffit donc de placer une grille de taille 1 x 3 dans l'entete et pied de page du master page de BIRT et d'insérer les valeurs qui vont bien dans la bonne cellule. La première cellule pour la zone de gauche. La deuxième cellule pour la zone du centre et la troisième cellule pour la zone de droite.
Néanmoins, même en respectant ces consignes, toutes les valeurs atterissent dans la zone du centre.
Hors si l'on regarde le code, on voit que BIRT prévoit bien la possibilité de choisir sa zone :
Code Java : 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 public String getRowValue( IRowContent row ) { StringBuffer rowValue = new StringBuffer( ); Collection list = row.getChildren( ); Iterator iter = list.iterator( ); int cellCount = list.size( ); int currentCellCount = 0; while ( iter.hasNext( ) ) { currentCellCount++; Object child = iter.next( ); switch ( currentCellCount ) { case 1 : rowValue.append( "&L" ); break; case 2 : rowValue.append( "&C" ); break; case 3 : rowValue.append( "&R" ); break; default : break; } rowValue.append( getCellValue( (ICellContent) child ) ); } return rowValue.toString( ); }
Ce qui génère ceci par exemple :
Code Xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <Header x:Data="&LNom Prénom&CMon Rapport&Rune date"/> <Footer x:Data="&LGénéré le: une date&CMon Rapport&R© TOTO Cie"/>
Le problème vient du fait que les codes en "&X" ne semblent pas bon. En effet, si l'on modifie manuellement l'entête et pied de page du fichier excel depuis excel, on obtient ceci :
Code Xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <Header x:Data="&ENom Prénom&CMon Rapport&Dune date"/> <Footer x:Data="&EGénéré le: une date&CMon Rapport&D© TOTO Cie"/>
La différence, c'est le code en "&X".
&L devient &E ;
&C reste &C ;
&R devient &D ;
Ma question est donc la suivante : s'agit-il d'un bogue (les mauvais codes ont été utilisés par les équipes de développement) ou ces codes là sont-ils dépendant de la version excel, du pays ou de je ne sais quel autre paramètre propre à la configuration de la machine cliente ?
Pour info je teste avec Excel 2003 sur un PC en france.
Merci. En espérant que quelqu'un ait une idée ou que Stefan pourra poser la question aux Labs.
Partager