<?php

// ------------------------------------------------------------------------- //
// Génération d'un fichier SYLK à partir de données MySQL en vue d'une       //
// récupération sous Excel.                                                  //
// L'avantange du format SYLK par rapport au format CSV est qu'il permet de  //
// définir des attributs de mise en forme pour les données : alignement,     //
// gras, itallique, formats de données, ...                                  //
// ------------------------------------------------------------------------- //
// Auteur: J-Pierre DEZELUS                                                  //
// Email:  jpdezelus@phpinfo.net                                             //
// Web:    http://www.phpinfo.net/                                           //
// ------------------------------------------------------------------------- //

define("FORMAT_REEL",   1); // #,##0.00
define("FORMAT_ENTIER", 2); // #,##0
define("FORMAT_TEXTE",  3); // @

$cfg_formats[FORMAT_ENTIER] = "FF0";
$cfg_formats[FORMAT_REEL]   = "FF2";
$cfg_formats[FORMAT_TEXTE]  = "FG0";

// ----------------------------------------------------------------------------

$cfg_hote = 'localhost';
$cfg_user = 'root';
$cfg_pass = '';
$cfg_base = 'mabase';

// ----------------------------------------------------------------------------

if (mysql_connect($cfg_hote, $cfg_user, $cfg_pass))
{
    
// construction de la requête
    // ------------------------------------------------------------------------
    
$sql  = "SELECT code, rubrique, titre, auteur ";
    
$sql .= "FROM astuces ";
    
$sql .= "WHERE theme=1 "; // PHP
    
$sql .= "ORDER BY rubrique, titre";

    
$champs = Array(
      
//     champ       en-tête     format         align  width
      
Array( 'code',     'N°',       FORMAT_ENTIER, 'R',     5 ),
      Array(
'rubrique', 'Rubrique', FORMAT_TEXTE,  'L',    20 ),
      Array(
'titre',    'Astuce',   FORMAT_TEXTE,  'L',    70 ),
      Array(
'auteur',   'Auteur',   FORMAT_TEXTE,  'C',    20 )
    );
    
// ------------------------------------------------------------------------

    
if ($resultat = mysql_db_query($cfg_base, $sql))
    {
        
// en-tête HTTP
        // --------------------------------------------------------------------
        
header('Content-disposition: filename=astuces.slk');
        
header('Content-type: application/octetstream');
        
header('Pragma: no-cache');
        
header('Expires: 0');

        
// en-tête du fichier
        // --------------------------------------------------------------------
        
echo "ID;PASTUCES-phpInfo.net\n"; // ID;Pappli
        
echo "\n";
        
// formats
        
echo "P;PGeneral\n";      
        echo
"P;P#,##0.00\n";       // P;Pformat_1 (reels)
        
echo "P;P#,##0\n";          // P;Pformat_2 (entiers)
        
echo "P;P@\n";              // P;Pformat_3 (textes)
        
echo "\n";
        
// polices
        
echo "P;EArial;M200\n";
        echo
"P;EArial;M200\n";
        echo
"P;EArial;M200\n";
        echo
"P;FArial;M200;SB\n";
        echo
"\n";
        
// nb lignes * nb colonnes
        
echo "B;Y".(mysql_num_rows($resultat)+1);
        echo
";X".($nbcol = mysql_num_fields($resultat))."\n"; // B;Yligmax;Xcolmax
        
echo "\n";

        
// récupération des infos de formatage
        // --------------------------------------------------------------------
        
for ($cpt = 0; $cpt < $nbcol; $cpt++)
        {
            
$num_format[$cpt] = $champs[$cpt][2];
            
$format[$cpt]     = $cfg_formats[ $num_format[$cpt] ] . $champs[$cpt][3];
        }

        
// largeurs des colonnes
        // --------------------------------------------------------------------
        
for ($cpt = 1; $cpt <= $nbcol; $cpt++)
        {
            
// F;Wcoldeb colfin largeur
            
echo "F;W".$cpt." ".$cpt." ".$champs[$cpt-1][4]."\n";
        }
        echo
"F;W".$cpt." 256 8\n"; // F;Wcoldeb colfin largeur
        
echo "\n";

        
// en-tête des colonnes (en gras --> SDM4)
        // --------------------------------------------------------------------
        
for ($cpt = 1; $cpt <= $nbcol; $cpt++)
        {
            echo
"F;SDM4;FG0C;".($cpt == 1 ? "Y1;" : "")."X".$cpt."\n";
            echo
"C;N;K\"".$champs[$cpt-1][1]."\"\n";
        }
        echo
"\n";

        
// données
        // --------------------------------------------------------------------
        
$ligne = 2;
        while (
$enr = mysql_fetch_array($resultat))
        {
            
// parcours des champs
            
for ($cpt = 0; $cpt < $nbcol; $cpt++)
            {
                
// format
                
echo "F;P".$num_format[$cpt].";".$format[$cpt];
                echo (
$cpt == 0 ? ";Y".$ligne : "").";X".($cpt+1)."\n";
                
// valeur
                
if ($num_format[$cpt] == FORMAT_TEXTE)
                    echo
"C;N;K\"".str_replace(';', ';;', $enr[$cpt])."\"\n"; // ajout des ""
                
else
                    echo
"C;N;K".$enr[$cpt]."\n";
            }
            echo
"\n";
            
$ligne++;
        }

        
// fin du fichier
        // --------------------------------------------------------------------
        
echo "E\n";
    }
    
mysql_close();
}

?>