Bonjour, peut-on aligner verticalement dans un MultiCell ?
Bonjour, peut-on aligner verticalement dans un MultiCell ?
J'ai un tableau avec deux MultiCell sur la même ligne.
Si le premier n'a qu'une ligne et le secon deux, le premier a la couleur de fon et la bodure que la premiere ligne donc pas cool du tout...
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 function CotisationTable($header,$data){ //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.1); $this->SetFont('','B'); //En-tête $w=array(40,90,25,50,42,32); 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){ unset($nb_ligne); $x_base = $this->GetX(); $nb_ligne[] = $this->NbLines($w[1],$row[1]); $nb_ligne[] .= $this->NbLines($w[2],$row[2]); $nb_ligne[] .= $this->NbLines($w[4],$row[4]); $nb_ligne_max = max($nb_ligne); $this->Cell($w[0],(6*$nb_ligne_max),$row[0],'LR',0,'C',$fill); $x = $this->getX(); $y = $this->getY(); $this->MultiCell($w[1],6,$row[1],'LR','L',$fill); $this->SetXY(($x+$w[1]),($y)); $x = $this->getX(); $y = $this->getY(); $this->MultiCell($w[2],6,$row[2],'LR','L',$fill); $this->SetXY(($x+$w[2]),($y)); //$this->Cell($w[2],(6*$nb_ligne_max),$row[2],'LR',0,'L',$fill); $this->Cell($w[3],(6*$nb_ligne_max),$row[3],'LR',0,'R',$fill); $x = $this->getX(); $y = $this->getY(); $this->MultiCell($w[4],6,$row[4],'LR','L',$fill); $this->SetXY(($x+$w[4]),($y)); $this->Cell($w[5],(6*$nb_ligne_max),$row[5],'LR',0,'R',$fill); $this->SetXY($x_base,($y+($nb_ligne_max*6))); $fill=!$fill; } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); } //renvoye le nombre de ligne d'un MultiCell prend en parametres une largeur et un texte function NbLines($w,$txt){ //Computes the number of lines a MultiCell of width w will take $cw=&$this->CurrentFont['cw']; if($w==0) $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); if($nb>0 and $s[$nb-1]=="\n") $nb--; $sep=-1; $i=$j=$l=0; $nl=1; while($i<$nb){ $c=$s[$i]; if($c=="\n"){ $i++; $sep=-1; $j=$i; $l=0; $nl++; continue; } if($c==' ') $sep=$i; $l+=$cw[$c]; if($l>$wmax){ if($sep==-1){ if($i==$j) $i++; } else $i=$sep+1; $sep=-1; $j=$i; $l=0; $nl++; } else $i++; } return $nl; }
J'ai aps tout comprit non plus là Oo
Cela dit, non, tu ne peux pas aligner verticalement dans un MultiCell , à toi de bidouiller une fonction qui va ajouter des "\n" au bon endroit dans ta chaine à afficher. C'est comme ça que j'ai fais pour réaliser une classe d'affichage PDF de tableaux, gérant les multicell ( contrairement au script donné par Olivier sur fpdf.org)
Je tente de me réexpliquer j'ai un tableau
sur chaque ligne de tableau j'ai 2 MultiCell
mes lignes ont une couleur de fond qui alterne, transparent ou bleu clair
sur le transparent pas de probleme
sur le bleu, si mon Multicell ne contient qu'une ligne, seul celle ci a le fond bleu mais si le deuxième multicell contient deux lignes pour afficher la ligne suivante du tableau je saute deux ligne, dans mon premier multicelle je me retrouve donc avec une ligne bleu et la seconde transparente car le MultiCell ne fait qu'une ligne.
En fait meme si la ligne est vide il faudrait que je lui dise qu'il y en a une pour avoir la couleur de fond...
J'ai été clair là ?
bah dans tous les cas il faut que tes 2 multicell sur la même ligne aient la même hauteur, donc il va falloir calculer à l'avance ( avant de tracer ta ligne ) la hauteur des 2 multicells, en nombre de ligne ( avec une fonction que je t'avais filé) , garder en mémoire la plus grande des 2 valeurs, retoucher l'une des 2 chaines passé au multicell de façon à ajouter autant de "\n" que nécessaire, afin qu'à l'affichage les 2 multicells fassent la même hauteur.
C'est ptet un peu bidouille mais c'est à mon avis la seule façon de faire.
Salut,
Tu as ceci
Je penses pas qu'elle soit si interessante pour faire des tableaux avec du texte dedan :/ Fin surtout si on veut pas perdre d'informations.La fonction drawTextBox() affiche une chaîne à l'intérieur d'un rectangle ; elle est tronquée si elle déborde.
Bonjour, j'ai fait ceci mais ca écrit les \n plutot que me faire un retour a la ligne
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 function CotisationTable($header,$data){ //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.1); $this->SetFont('','B'); //En-tête $w=array(40,90,25,50,42,32); 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){ unset($nb_ligne); $x_base = $this->GetX(); $nb_ligne[] = $this->NbLines($w[1],$row[1]); $nb_ligne[] .= $this->NbLines($w[2],$row[2]); $nb_ligne[] .= $this->NbLines($w[4],$row[4]); $nb_ligne_max = max($nb_ligne); $this->Cell($w[0],(6*$nb_ligne_max),$row[0],'LR',0,'C',$fill); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[0]; $bckn =''; for($i=0;$i < $nb_bckn;$i++) $bckn .= '\n'; $this->MultiCell($w[1],6,$row[1].$bckn,'LR','L',$fill); $this->SetXY(($x+$w[1]),($y)); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[1]; $bckn =''; for($i=0;$i < $nb_bckn;$i++) $bckn .= '\n'; $this->MultiCell($w[2],6,$row[2].$bckn,'LR','L',$fill); $this->SetXY(($x+$w[2]),($y)); $this->Cell($w[3],(6*$nb_ligne_max),$row[3],'LR',0,'R',$fill); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[02]; $bckn =''; for($i=0;$i < $nb_bckn;$i++) $bckn .= '\n'; $this->MultiCell($w[4],6,$row[4].$bckn,'LR','L',$fill); $this->SetXY(($x+$w[4]),($y)); $this->Cell($w[5],(6*$nb_ligne_max),$row[5],'LR',0,'R',$fill); $this->SetXY($x_base,($y+($nb_ligne_max*6))); $fill=!$fill; } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); }
J'ai mis les \n entre " au lieu de ' il ne s'affiche plus mais je n'ai pas de retour à la ligne....
c'est bon, il fallait mettre <= a la place de < dans les if
Petite question subsidiare, comment puis je faire pour répéter l'en tete du tableau à chaque haut de page ?
J'ai encore fait des modifs, ca marche bien sur la premiere page mais sur la seconde ca passe a la ligne apres chaque MultiCell
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 function CotisationTable($header,$data){ //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.1); $this->SetFont('','B'); //En-tête $w=array(40,90,25,50,42,32); 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){ unset($nb_ligne); $x_base = $this->GetX(); $nb_ligne[] = $this->NbLines($w[0],$row[0]); $nb_ligne[] .= $this->NbLines($w[1],$row[1]); $nb_ligne[] .= $this->NbLines($w[2],$row[2]); $nb_ligne[] .= $this->NbLines($w[3],$row[3]); $nb_ligne[] .= $this->NbLines($w[4],$row[4]); $nb_ligne[] .= $this->NbLines($w[5],$row[5]); $nb_ligne_max = max($nb_ligne); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[0]; $bckn =''; for($i=0;$i <= $nb_bckn;$i++) $bckn .= "\n"; $this->MultiCell($w[0],6,$row[0].$bckn,'LR','C',$fill); $this->SetXY(($x+$w[0]),($y)); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[1]; $bckn =''; for($i=0;$i <= $nb_bckn;$i++) $bckn .= "\n"; $this->MultiCell($w[1],6,$row[1].$bckn,'LR','L',$fill); $this->SetXY(($x+$w[1]),($y)); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[2]; $bckn =''; for($i=0;$i <= $nb_bckn;$i++) $bckn .= "\n"; $this->MultiCell($w[2],6,$row[2].$bckn,'LR','L',$fill); $this->SetXY(($x+$w[2]),($y)); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[3]; $bckn =''; for($i=0;$i <= $nb_bckn;$i++) $bckn .= "\n"; $this->MultiCell($w[3],6,$row[3].$bckn,'LR','R',$fill); $this->SetXY(($x+$w[3]),($y)); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[4]; $bckn =''; for($i=0;$i <= $nb_bckn;$i++) $bckn .= "\n"; $this->MultiCell($w[4],6,$row[4].$bckn,'LR','L',$fill); $this->SetXY(($x+$w[4]),($y)); $x = $this->getX(); $y = $this->getY(); $nb_bckn = $nb_ligne_max - $nb_ligne[5]; $bckn =''; for($i=0;$i <= $nb_bckn;$i++) $bckn .= "\n"; $this->MultiCell($w[5],6,$row[5].$bckn,'LR','R',$fill); $this->SetXY($x_base,($y+($nb_ligne_max*6))); $fill=!$fill; } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); }
Personne pour me donenr un coup de main ?
Une fois que j'ai résolu ce problème mon pdf est fini, il marchait avant que je mette des MultiCell partout mais l'alignement n'était pas beau...
Ca sert à rien de faire des up constamment, merci d'arrêter. Si on ne répond pas c'est qu'on a pas de réponse.
FPDF a un forum, tu devrais peut-être te tourner vers eux pour ce genre de problème.
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