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