# Tableaux

Ce tutoriel montre différentes manières de réaliser des tableaux.

    <?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(';',trim($line));
        return $data;
    }

    // Tableau simple
    function BasicTable($header, $data)
    {
        // En-tête
        foreach($header as $col)
            $this->Cell(40,7,$col,1);
        $this->Ln();
        // Données
        foreach($data as $row)
        {
            foreach($row as $col)
                $this->Cell(40,6,$col,1);
            $this->Ln();
        }
    }

    // Tableau amélioré
    function ImprovedTable($header, $data)
    {
        // Largeurs des colonnes
        $w = array(40, 35, 45, 40);
        // 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,number_format($row[2],0,',',' '),'LR',0,'R');
            $this->Cell($w[3],6,number_format($row[3],0,',',' '),'LR',0,'R');
            $this->Ln();
        }
        // Trait de terminaison
        $this->Cell(array_sum($w),0,'','T');
    }

    // 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(40, 35, 45, 40);
        for($i=0;$i<count($header);$i++)
            $this->Cell($w[$i],7,$header[$i],1,0,'C',true);
        $this->Ln();
        // Restauration des couleurs et de la police
        $this->SetFillColor(224,235,255);
        $this->SetTextColor(0);
        $this->SetFont('');
        // Données
        $fill = false;
        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,number_format($row[2],0,',',' '),'LR',0,'R',$fill);
            $this->Cell($w[3],6,number_format($row[3],0,',',' '),'LR',0,'R',$fill);
            $this->Ln();
            $fill = !$fill;
        }
        // Trait de terminaison
        $this->Cell(array_sum($w),0,'','T');
    }
    }

    $pdf = new PDF();
    // Titres des colonnes
    $header = array('Pays', 'Capitale', 'Superficie (km²)', 'Pop. (milliers)');
    // Chargement des données
    $data = $pdf->LoadData('pays.txt');
    $pdf->SetFont('Arial','',14);
    $pdf->AddPage();
    $pdf->BasicTable($header,$data);
    $pdf->AddPage();
    $pdf->ImprovedTable($header,$data);
    $pdf->AddPage();
    $pdf->FancyTable($header,$data);
    $pdf->Output();
    ?>

[Démo]

Un tableau n'étant qu'un ensemble de cellules, il est naturel de les construire à partir de ces dernières. Le premier est réalisé de la manière la plus élémentaire qui soit : de simples cellules encadrées, toutes de la même taille et alignées à gauche. Le résultat est rudimentaire mais très rapide à obtenir.
Le deuxième tableau apporte quelques améliorations : chaque colonne a sa propre largeur, les titres sont centrés et les nombres cadrés à droite. De plus, les traits horizontaux ont été enlevés. Ceci est réalisé grâce au paramètre `border` de la méthode Cell(), qui permet de spécifier quels bords de la cellule doivent être tracés. Dans le cas présent, on désire les bords gauches (`L`) et droits (`R`). Reste le problème du trait horizontal final pour refermer le tableau. Il y a deux possibilités : soit tester dans la boucle si on se trouve sur la dernière ligne, auquel cas on utilise `LRB` pour le paramètre `border` ; soit, comme c'est fait ici, ajouter le trait une fois la boucle terminée.
Le troisième tableau est semblable au deuxième mais utilise des couleurs. Il suffit pour cela de préciser les couleurs de fond, de texte et de trait souhaitées. L'alternance de couleur pour les lignes est obtenue en utilisant des cellules à fond alternativement coloré et transparent.