Bonjour à tous !
Je voudrais exporter les JTables de mon appli Java en PDF avec FOP. Afin d'éviter d'avoir à faire une feuille de style pour chaque table, j'aimerai n'en avoir qu'une qui adapte le nombre de lignes/colonnes en fonction du flux XML.
Auriez-vous une petite idée ? Pour les lignes y a pas de problème, mais pour les colonnes, je bloque un peu...
En fait le problème est à la génération :
Si je n'ai que 3 colonnes dans mon XML --> j'ai 6 colonnes dans mon PDF (avec comme header : D-E-F...)
A l'inverse, si j'ai 7 colonnes, je n'ai alors que 6 headers dans le pdf, quant aux valeurs, elles sont ajoutées correctement...
Bref, j'ai l'impression qu'il fait un peu ce qu'il veut et moi je suis perdu
Voici ce que j'ai fais pour le moment :
La feuille xsl
La fichier xml :
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 <?xml version="1.0" encoding="UTF-8"?> <!-- --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="2.5cm"> <fo:region-body margin-top="3cm"/> <fo:region-before extent="3cm"/> <fo:region-after extent="1.5cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="simple"> <fo:flow flow-name="xsl-region-body"> <xsl:apply-templates select="data"/> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <!-- Handling data --> <xsl:template match="data"> <fo:block> <xsl:apply-templates select="name"/> </fo:block> <fo:block font-size="14pt" font-family="sans-serif" space-after.optimum="15pt" background-color="silver" color="black" text-indent="5mm" space-before="10mm" padding-top="3pt" border-top-color="orange" border-top-style="solid" border-top-width="medium"> Records </fo:block> <!-- Creating table --> <fo:table table-layout="fixed" space-before.optimum="10pt"> <!-- Computes the column number count(column-name)--> <xsl:variable name="cols" select="count(./column-name)"/> <xsl:variable name="ratio" select="16 div ($cols)"/> <xsl:variable name="k" select="concat(format-number($ratio, '##.##'), 'cm')"/> <!-- for each columns, get the col. size and set the position --> <xsl:for-each select="./*"> <fo:table-column> <xsl:attribute name="column-width"> <xsl:value-of select="$k"/> </xsl:attribute> <xsl:attribute name="column-number"> <xsl:value-of select="position()"/> </xsl:attribute> </fo:table-column> </xsl:for-each> <!-- Fill the column headers --> <fo:table-body> <fo:table-row> <xsl:for-each select="column-name"> <fo:table-cell border="0.5pt solid black" background-color="silver"> <fo:block color="white" font-size="10pt" line-height="11pt" text-align="center" space-before.optimum="5pt"> <xsl:value-of select="text()"/> </fo:block> </fo:table-cell> </xsl:for-each> </fo:table-row> <!-- Fill the table --> <xsl:apply-templates select="row"/> </fo:table-body> </fo:table> </xsl:template> <xsl:template match="name"> <fo:block font-size="18pt" font-family="sans-serif" line-height="24pt" space-after.optimum="15pt" background-color="silver" color="black" text-align="center" padding-top="3pt" border-top-color="orange" border-top-style="solid" border-top-width="medium"> <xsl:value-of select="."/> </fo:block> </xsl:template> <!-- handling rows--> <xsl:template match="row"> <fo:table-row> <xsl:for-each select="./*"> <fo:table-cell border="0.5pt solid black"> <fo:block color="black" font-size="8pt" line-height="11pt" text-align="center" space-before.optimum="5pt"> <xsl:if test="."><xsl:value-of select="."/></xsl:if> </fo:block> </fo:table-cell> </xsl:for-each> </fo:table-row> </xsl:template> </xsl:stylesheet>
Merci aux courageux qui seront arrivés jusqu'ici
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 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE data SYSTEM "file.dtd"> <data> <name>Exportation</name> <column-name>one</column-name> <row number = "0"> <value column-name="one">coucou</value> <value column-name="two">2</value> <value column-name="three">3</value> <value column-name="four">4</value> </row> <column-name>two</column-name> <row number = "1"> <value column-name="one">1</value> <value column-name="two">je</value> <value column-name="three">3</value> <value column-name="four">4</value> </row> <column-name>three</column-name> <row number = "2"> <value column-name="one">1</value> <value column-name="two">2</value> <value column-name="three">m'appelle</value> <value column-name="four">4</value> </row> <column-name>four</column-name> <row number = "3"> <value column-name="one">1</value> <value column-name="two">2</value> <value column-name="three">3</value> <value column-name="four">brian</value> </row> <column-name>E</column-name> <row number = "4"> <value column-name="one">le</value> <value column-name="two">bo</value> <value column-name="three">gosse</value> <value column-name="four">4</value> </row> <column-name>F</column-name> <row number = "5"> <value column-name="one">first</value> <value column-name="two">of</value> <value column-name="three">all</value> <value column-name="four">welcome</value> </row> </data>
+++
Ju
Partager