Bonjour,
J'aimerais savoir si c'est possible d'avoir plusieurs lignes dans une cell automatiquement ?
Question simple mais dont je n'ai pas trouvé la réponse!
Merci.
Bonjour,
J'aimerais savoir si c'est possible d'avoir plusieurs lignes dans une cell automatiquement ?
Question simple mais dont je n'ai pas trouvé la réponse!
Merci.
Salut, tu peux faire des cellules avec plusieurs ligns en utilisant la méthode
MultiCell
Vas voir sur fpdf.org pour les arguments et des explications...
++
JC
Salut jc_cornic,
merci de ta réponse.
Le probleme est que si j'utilise une multicell alors il va y avoir une autre cellule qui se créera en dessous de la premiere!
Ce que je souhaite c'est que la cellule ne change pas de dimension mais que le texte se mette quand même sur deux lignes. Je ne sais pas si c'est possible ou non.
Je ne sais pas si je me fait bien comprendre
Merci, quand même.
Salut, effectivement, cela ne semble pas clair... As tu du code à proposer ???
Sinon, avec MultiCell, tu peux choisir la taille de ta cellule et avec \n dans le texte, tu peux faire des retours à la ligne comme tu veux...
Le problème est que si tu fais 2 MultiCell à la suite, fpdf les met l'une en dessous de l'autre. Ce problème est solutionnable (ça existe ce mot?)
Tu mémorise la position (x1, y1) de ta MultiCell1, sa taille (sizeX, sizeY) et tu place la deuxième en même y (y2=y1) et tu change le x (x2 = x1+sizeX)
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 $x1=10; $y1=50; $sizeX=100; $sizeY=40; $pdf->SetXY($x1, $x2); $pdf->MultiCell($sizeX, $sizeY, "mon texte\navec des retours chariots", 1, "C", 0); // placement de la deuxième MultiCell $pdf->SetXY($x1+$sizeX, $y1); $pdf->MultiCell($sizeX, $sizeY, "mon deuxième texte\navec des retours chariots", 1, "C", 0); ...
Espérant t'avoir aidé...
++
JC
Salut jc_cornic, je te remercie de ta réponse!!
Désolé de revenir si tard mais j'avais kaissé ce probleme de coté...
Je pense que Imoreion a posé la même question que moi concernant le retour a la ligne dans une multicell.
Le probleme est lorsque l'on insere une multicell on perd la postion et si il y a un retour a la ligne alors la multicell prend la place de deux multicell en hauteur.
Si je comprend bien pour rester dans une ligne, on est obligé de récupérer les valeurs de la position, insérer une multicell(en la prévoyant assez fine au cas ou il y a des retours a la ligne) et ensuite insérer la suite de notre ligne grace a la position qu'on a récupérer!
Je trouve que sa fait pas mal, juste pour un retour a la ligne!
peut etre a tu une autre solution!
Je te remercie,
Franchesko.
Non, c'est plus simple que cela. La hauteur $h que tu indiques pour une multicell est la hauteur d'une ligne. s'il y a n lignes, la multicell se redimensionnera automatiquement à n*$h en hauteur.
Si tu ne veux pas avoir à gérer à chaque fois les problèmes de curseur - par exemple si plusieurs multicells doivent figurer sur la même ligne - le mieux est sans doute de surcharger la méthode dans une classe dérivée. J'utilise la surcharge suivante, assez simple comme tu peux le constater :
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 //---------------------------------------------------------------------------- // MULTI CELL // @in $w = largeur de la cellule (occupe toute la ligne si $w == 0) // @in $h = hauteur de la ligne (et non pas de la cellule multi-lignes !!) // @in $txt = texte à insérer // @in $border = spécification de bordure (0,1,'L','T','R','B') // @in $align = spécification d'alignement ('L', 'R', 'C', 'J') // @in $fill = spécification de remplissage (0,1) // @in $cursorPos = placement du curseur après traitement (0=à droite, 1=saut de ligne) //---------------------------------------------------------------------------- function multiCell($w, $h, $txt, $border = 0, $align = 'J', $fill = 0, $cursorPos = 1) { // NB : ces contorsions sont rendues nécessaires par le fait que dans la classe de base, // SetY() a comme effet de bord de replacer le curseur à gauche... if( $cursorPos == 0 ) { $y = $this->GetY(); $x = $this->GetX() + $w; } parent::MultiCell($w, $h, $txt, $border, $align, $fill); if( $cursorPos == 0 ) { $this->SetY($y); $this->SetX($x); } }
Salut ^^
J'ai résolu mon problème de cellules dans mon post : http://www.fpdf.org/fr/script/script3.php
Hum c'est pas aussi simple que ça finalement.
Herode, pourrais-tu me dire où placer dans mon script ta fonction multiCell() stp ?
Merci ^^
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 <? // Export en PDF require('fpdf.php'); class PDF extends FPDF { //En-tête function Header() { //Logo $this->Image('LOGOROC.jpg',10,8,33); //Police Arial gras 15 $this->SetFont('Arial','B',15); //Décalage à droite $this->Cell(80); //Titre $this->Cell(30,15,'Répertoire du personnel',0,0,'C'); //Saut de ligne $this->Ln(20); } //Pied de page function Footer() { //Positionnement à 1,5 cm du bas $this->SetY(-15); //Police Arial italique 8 $this->SetFont('Arial','I',8); //Numéro de page $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); } //Chargement des données function LoadData($file) { //Lecture des lignes du fichier $lines=file($file); $data=array(); foreach($lines as $line) $data[]=explode(';',chop($line)); return $data; } //Tableau coloré function FancyTable($header,$data) { //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.3); $this->SetFont('','B'); //En-tête $w=array(38,38,35,15,22,22,22); for($i=0;$i<count($header);$i++) $this->Cell($w[$i],7,$header[$i],1,0,'C',1); $this->Ln(); //Restauration des couleurs et de la police $this->SetFillColor(224,235,255); $this->SetTextColor(0); $this->SetFont(''); //Données $fill=0; foreach($data as $row) { $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill); $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill); $this->Cell($w[2],6,$row[2],'LR',0,'L',$fill); $this->Cell($w[3],6,$row[3],'LR',0,'L',$fill); $this->Cell($w[4],6,$row[4],'LR',0,'L',$fill); $this->Cell($w[5],6,$row[5],'LR',0,'L',$fill); $this->Cell($w[6],6,$row[6],'LR',0,'L',$fill); $this->Ln(); $fill=!$fill; } $this->Cell(array_sum($w),0,'','T'); } } $pdf=new PDF(); //Titres des colonnes $header=array('Service','Fonction','Nom','Num int', 'Num ext', 'Num port', 'Num fax'); //Chargement des données $data=$pdf->LoadData('repertoire.csv'); $pdf->SetFont('Arial','',10); $pdf->AddPage(); $pdf->FancyTable($header,$data); $pdf->AliasNbPages(); $pdf->SetFont('Times','',10); $pdf->Output(); ?>
Tu peux en faire une méthode de ta classe PDF. Comme elle dérive de FPDF, PDF::MultiCell() surchargera FPDF::MultiCell().
Je te remercie de ton aide, mais, - désolé de paraître neuneu -, j'ai rien compris
Je suis désolé, étant un pur débutant, je n'ai jamais entendu parler de ces méthodes et surcharges
Que dois-je faire concrètement ?
Merci de ton aide et désolé pour l'abus
Ha, ok ! Je reformule de manière moins laconique en ce cas.
La classe FPDF est... une classe. Elle obéit donc aux principes de base du développement par objets. Je ne vais pas te faire de cours là-dessus, si tu ne connais pas, fonce sur les FAQ/tutos et bouquins qui en parlent. Mais en résumé, pour expliquer le principe des surcharges et (un peu) le code dans ma version de MultiCell():
donne comme sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class A { function display() { echo "A::display"; } } class B extends A { function display() { echo "B::display"; } } class C extends A { function display() { echo parent::display()." -- B::display"; } } $obj = new A(); $obj->display(); echo "<br/>"; $obj = new B(); $obj->display(); echo "<br/>"; $obj = new C(); $obj->display();
La classe de base A fait son travail. RAS.A::display
B::display
A::display -- C::display
B hérite de A, donc de ses méthodes. Mais B a redéfini (surchargé) la méthode display(). C'est donc cette nouvelle version qui est appelée sur la deuxième ligne.
C hérite de A et surcharge aussi display() mais fait appel, au sein de cette méthode, à la version originale (parent::display), à laquelle elle ajoute une nouvelle chaîne.
Je n'en dis pas plus sur l'héritage, les surcharges et le polymorphisme, cf. les cours (indispensables ) à ce le sujet.
Conclusion : dans ton cas :
Tu insère la nouvelle version de la fonction MultiCell() dans ta classe dérivée, ici nommée PDF. C'est cette nouvelle version qui sera appelée. Attention aux arguments : la nouvelle version n'a pas exactement la même signature que l'ancienne, même si elle respecte le principe de substitution de Liskov. L'argument supplémentaire te permet de règler le comportement du curseur à la fin de rendu de la MultiCell. Par défaut, il fait comme d'hab' et passe à la ligne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class PDF extends FPDF { [..] function MultiCell(...) { ... } [...] } $pdf=new PDF(); $pdf->MultiCell(...); [...]
Merci beaucoup pour ton cours Herode
Je pense avoir tout compris
Demain je testerai tout ça !
Encore merci !
Ah beh non
En fait j'ai compris la théorie, mais je coince pour la pratique
Est-ce que je dois modifier le fichier fpdf.php ?
Et si oui/non, Que dois-je changer concrètement ?
Désolé, mais je n'arrive à apprendre que par l'exemple
Merci beaucoup !
P.S : je t'offrirai des fleurs à la fin
Je ne vois pas bien comment t'expliquer ça mieux et je ne vais tout de même pas faire le code à ta place car si tu n'as lu les cours, ce serait sans fin
Voir ici pour commencer : PHP5, FAQ
Salut,
Je fais des étiquettes pour les enveloppes où figurent :
Nom
Métier
Adresse
Code postal- Ville
Je dois prendre en compte un format spécial (étiquette 99.1*38.1). Pas de problème pour faire deux multiCell sur la même ligne, mais tout ce complique lorsque la chaîne de mon texte contient un "\n" ....
J'ai suivi tes conseils : Créer classe PDF qui dérive de FPDF et j'ai placé la méthode Multi-Cell.
Enfin dans mon fichier j'ai bien créé une instance de la classe PDF mais le résultat est exactement le même. Un saut de ligne provoque une hauteur de nbLignes*hauteur... Si vous pouviez m'aider ! Merci d'avance.
en fait j'ai posé un peu la même question il y a 2 semaines...je m'en suis sortie en créant un focntion tout simple qui me permet d'afficher mes cellules avec plusieurs lignes les unes à la suite des autres, et non les unes en dessou des autres!J'utilise tout simplment la fonction GetX et SetXY:
Voilà, en espèrant que ça vous soit utile!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function Multi_retour($w,$h,$txt,$b,$a,$f) { $x_m=$this->GetX(); $y_m=$this->GetY(); $this->MultiCell($w,$h,$txt,$b,$a,$f); $x_m=$x_m+$w; $this->SetXY($x_m,$y_m); }
J'ai une question concernant la fonction Multicell
D'après ce que j'ai compris cela crée les cellule d'un tableau dans lequel on peu faire un retour a la ligne dans une cellule??
Mon problème est de comprendre comment je peu faire pour le remplir a partir d'une base donnée Mysql
j'avais le même problème que toi maintenant sa marche
voici mon code en espérant que sa puisse aider quelqu'un
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 <?php require('fpdf.php'); class PDF extends FPDF { //Chargement des données function LoadData($file) { //Lecture des lignes du fichier $lines=file($file); $data=array(); foreach($lines as $line) $data[]=explode(';',chop($line)); return $data; } //Tableau amélioré function ImprovedTable($header,$data) { //Largeurs des colonnes $w=array(15,20,20,6,15,50,20,4,4,4,4,4,4,4,4,4); //En-tête for($i=0;$i<count($header);$i++) $this->Cell($w[$i],7,$header[$i],1,0,'C'); $this->Ln(); //Données foreach($data as $row) { $this->Cell($w[0],6,$row[0],'LR'); $this->Cell($w[1],6,$row[1],'LR'); $this->Cell($w[2],6,$row[2],'LR'); $this->Cell($w[3],6,$row[3],'LR'); $this->Cell($w[4],6,$row[4],'LR'); $this->Cell($w[5],6,$row[5],'LR'); $this->Cell($w[6],6,$row[6],'LR'); $this->Cell($w[7],6,$row[7],'LR'); $this->Cell($w[8],6,$row[8],'LR'); $this->Cell($w[9],6,$row[9],'LR'); $this->Cell($w[10],6,$row[10],'LR'); $this->Cell($w[11],6,$row[11],'LR'); $this->Cell($w[12],6,$row[12],'LR'); $this->Cell($w[13],6,$row[13],'LR'); $this->Cell($w[14],6,$row[14],'LR'); $this->Cell($w[15],6,$row[15],'LR'); $this->Ln(); } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); } function WordWrap(&$text, $maxwidth) { $text = trim($text); if ($text==='') return 0; $space = $this->GetStringWidth(' '); $lines = explode("\n", $text); $text = ''; $count = 0; foreach ($lines as $line) { $words = preg_split('/ +/', $line); $width = 0; foreach ($words as $word) { $wordwidth = $this->GetStringWidth($word); if ($wordwidth > $maxwidth) { // Word is too long, we cut it for($i=0; $i<strlen($word); $i++) { $wordwidth = $this->GetStringWidth(substr($word, $i, 1)); if($width + $wordwidth <= $maxwidth) { $width += $wordwidth; $text .= substr($word, $i, 1); } else { $width = $wordwidth; $text = rtrim($text)."\n".substr($word, $i, 1); $count++; } } } elseif($width + $wordwidth <= $maxwidth) { $width += $wordwidth + $space; $text .= $word.' '; } else { $width = $wordwidth + $space; $text = rtrim($text)."\n".$word.' '; $count++; } } $text = rtrim($text)."\n"; $count++; } $text = rtrim($text); return $count; } //---------------------------------------------------------------------------- // MULTI CELL // @in $w = largeur de la cellule (occupe toute la ligne si $w == 0) // @in $h = hauteur de la ligne (et non pas de la cellule multi-lignes !!) // @in $txt = texte à insérer // @in $border = spécification de bordure (0,1,'L','T','R','B') // @in $align = spécification d'alignement ('L', 'R', 'C', 'J') // @in $fill = spécification de remplissage (0,1) // @in $cursorPos = placement du curseur après traitement (0=à droite, 1=saut de ligne) //---------------------------------------------------------------------------- function multiCell($w, $h, $txt, $border = 0, $align = 'J', $fill = 0, $cursorPos = 1) { // NB : ces contorsions sont rendues nécessaires par le fait que dans la classe de base, // SetY() a comme effet de bord de replacer le curseur à gauche... if( $cursorPos == 0 ) { $y = $this->GetY(); $x = $this->GetX() + $w; } parent::MultiCell($w, $h, $txt, $border, $align, $fill); if( $cursorPos == 0 ) { $this->SetY($y); $this->SetX($x); } } } $pdf=new PDF(); $pdf->SetFont('Arial','',6); $pdf->AddPage(); mysql_connect("localhost","root","mysql"); mysql_select_db("documentaire"); $req = mysql_query("SELECT * FROM repertoire"); while($result = mysql_fetch_array($req)) { //$lieu=$result['lieu']; $nb=$pdf->WordWrap($result['lieu'], 15); $pdf->multiCell('20','3',$result['lieu'],'0','J','0','0'); //$type=$result['type']; $nb=$pdf->WordWrap($result['type'], 15); $pdf->multiCell('20','3',$result['type'],'0','J','0','0'); //$dom=$result['domaine']; $nb=$pdf->WordWrap($result['domaine'], 35); $pdf->multiCell('30','3',$result['domaine'],'0','J','0','0'); //$ind=$result['ind']; $nb=$pdf->WordWrap($result['ind'], 15); $pdf->multiCell('4','3',$result['ind'],'0','J','0','0'); //$ap=$result['application']; $nb=$pdf->WordWrap($result['application'], 11); $pdf->multiCell('14','3',$result['application'],'0','J','0','0'); //$rap=$result['rapport']; $nb=$pdf->WordWrap($result['rapport'], 15); $pdf->multiCell('20','3',$result['rapport'],'0','J','0','0'); //$int=$result['intitule']; $nb=$pdf->WordWrap($result['intitule'], 38); $pdf->multiCell('40','3',$result['intitule'],'0','J','0','0'); //$rq=$result['rq']; $nb=$pdf->WordWrap($result['rq'], 7); $pdf->multiCell('5','3',$result['rq'],'0','J','0','0'); //$ms=$result['ms']; $nb=$pdf->WordWrap($result['ms'], 7); $pdf->multiCell('5','3',$result['ms'],'0','J','0','0'); //$rs=$result['rs']; $nb=$pdf->WordWrap($result['rs'], 7); $pdf->multiCell('5','3',$result['rs'],'0','J','0','0'); //$uo=$result['uo']; $nb=$pdf->WordWrap($result['uo'], 7); $pdf->multiCell('5','3',$result['uo'],'0','J','0','0'); //$s=$result['s']; $nb=$pdf->WordWrap($result['s'], 7); $pdf->multiCell('5','3',$result['s'],'0','J','0','0'); //$c=$result['c']; $nb=$pdf->WordWrap($result['c'], 7); $pdf->multiCell('5','3',$result['c'],'0','J','0','0'); //$f=$result['f']; $nb=$pdf->WordWrap($result['f'], 7); $pdf->multiCell('5','3',$result['f'],'0','J','0','0'); //$m=$result['m']; $nb=$pdf->WordWrap($result['m'], 7); $pdf->multiCell('5','3',$result['m'],'0','J','0','0'); //$l=$result['l']; $nb=$pdf->WordWrap($result['l'], 7); $pdf->multiCell('5','3',$result['l'],'0','J','0','1'); //$pdf->multiCell('5','3',"",'1','J','0','1'); $pdf->Cell(190,6,"",0,1,'C'); } //Titres des colonnes //$header=array("lieu","Type de procedure","Domaine","indice","Date d application","Intitulé du document","Ident","RQ","MS","RS","UO","S","C","F","M","L"); //$test=array("","","","","","","","","","","","","","",""); $pdf->Output(); ?>
merci pour votre code qui' m a beaucoup servi
mais je n'arrive pas à ajouter l'entete de tableau
j'ai crée une fonction header
function ImprovedTable($header)
{
//Largeurs des colonnes
$w=array(15,125,125);
//En-tête
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C');
$this->Ln();
//
// $this->Cell(array_sum($w),0,'','T');
}
et j'ai fait appel à $header
ça n'affiche rien
aidez moi svp
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager