Question

Je dois créer un script qui prend une table mySQL, et il exporte en format .XLS et enregistre ce fichier dans un dossier spécifié sur l'hôte Web.

Je l'ai travail, mais semble maintenant je ne peux pas l'obtenir pour enregistrer automatiquement le fichier à l'emplacement sans demander à l'utilisateur.

Il faut courir tous les jours à un moment donné, il peut donc enregistrer les jours précédents conduit dans un fichier .XLS sur l'hôte Web.

Voici le code:

<?php

// DB TABLE Exporter
//
// How to use:
//
// Place this file in a safe place, edit the info just below here
// browse to the file, enjoy!

// CHANGE THIS STUFF FOR WHAT YOU NEED TO DO

     $dbhost  = "-";
     $dbuser  = "-";
     $dbpass  = "-";
     $dbname  = "-";
     $dbtable = "-";

// END CHANGING STUFF

$cdate = date("Y-m-d"); // get current date


// first thing that we are going to do is make some functions for writing out
// and excel file. These functions do some hex writing and to be honest I got 
// them from some where else but hey it works so I am not going to question it 
// just reuse


// This one makes the beginning of the xls file
function xlsBOF() {
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
    return;
}

// This one makes the end of the xls file
function xlsEOF() {
    echo pack("ss", 0x0A, 0x00);
    return;
}

// this will write text in the cell you specify
function xlsWriteLabel($Row, $Col, $Value ) {
    $L = strlen($Value);
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
    echo $Value;
    return;
}



// make the connection an DB query
$dbc = mysql_connect( $dbhost , $dbuser , $dbpass ) or die( mysql_error() );
mysql_select_db( $dbname );
$q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'";
$qr = mysql_query( $q ) or die( mysql_error() );


// Ok now we are going to send some headers so that this 
// thing that we are going make comes out of browser
// as an xls file.
// 
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

//this line is important its makes the file name
header("Content-Disposition: attachment;filename=export_".$dbtable.".xls ");

header("Content-Transfer-Encoding: binary ");

// start the file
xlsBOF();

// these will be used for keeping things in order.
$col = 0;
$row = 0;

// This tells us that we are on the first row
$first = true;

while( $qrow = mysql_fetch_assoc( $qr ) )
{
    // Ok we are on the first row
    // lets make some headers of sorts
    if( $first )
    {
        foreach( $qrow as $k => $v )
        {
            // take the key and make label
            // make it uppper case and replace _ with ' '
            xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) );
            $col++;
        }

        // prepare for the first real data row
        $col = 0;
        $row++;
        $first = false;
    }

    // go through the data
    foreach( $qrow as $k => $v )
    {
        // write it out
        xlsWriteLabel( $row, $col, $v );
        $col++;
    }
    // reset col and goto next row
    $col = 0;
    $row++;
}

xlsEOF();
exit();
?>

J'essayé d'utiliser, fwrite pour ce faire, mais il ne semble pas aller très bien, je l'ai enlevé les informations d'en-tête aussi, mais rien ne fonctionnait.

Voici le code d'origine, comme je l'ai trouvé, toute aide serait grandement appréciée. : -)

Thanx à l'avance. : -)

Était-ce utile?

La solution

Tout d'abord, puisque vous enregistrez ce disque via Cron vous devez supprimer tous les en-tête () appelle que vous doutiez. Pour réécrire aussi peu de votre code que possible, je vous conseille d'utiliser en mémoire tampon de sortie ( http://www.php.net/manual/en/ref.outcontrol.php ). Pour ce faire, un appel à ob_start () avant votre sortie de fichier commence:

ob_start();
// start the file
xlsBOF();

Et après la fin de votre sortie, fermez le tampon de sortie, capturer son contenu et les écrire dans un fichier:

xlsEOF();
// $filename should be set to some writeable location
file_put_contents($filename, ob_get_clean());

Autres conseils

Voici le code final, cela fonctionne comme un charme.

<?php

    // DB TABLE Exporter
    //
    // How to use:
    //
    // Place this file in a safe place, edit the info just below here
    // browse to the file, enjoy!

    // CHANGE THIS STUFF FOR WHAT YOU NEED TO DO
         $cdate = date("Y-m-d");
         $dbhost  = "-";
         $dbuser  = "-";
         $dbpass  = "-";
         $dbname  = "-";
         $dbtable = "-";
         $filename = "exported_on_$cdate.xls";

    // END CHANGING STUFF


    // first thing that we are going to do is make some functions for writing out
    // and excel file. These functions do some hex writing and to be honest I got 
    // them from some where else but hey it works so I am not going to question it 
    // just reuse


    // This one makes the beginning of the xls file
    function xlsBOF() {
        echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
        return;
    }

    // This one makes the end of the xls file
    function xlsEOF() {
        echo pack("ss", 0x0A, 0x00);
        return;
    }

    // this will write text in the cell you specify
    function xlsWriteLabel($Row, $Col, $Value ) {
        $L = strlen($Value);
        echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
        echo $Value;
        return;
    }



    // make the connection an DB query
    $dbc = mysql_connect( $dbhost , $dbuser , $dbpass ) or die( mysql_error() );
    mysql_select_db( $dbname );
    $q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'";
    $qr = mysql_query( $q ) or die( mysql_error() );

    //start the object
     ob_start();

    // start the file
    xlsBOF();

    // these will be used for keeping things in order.
    $col = 0;
    $row = 0;

    // This tells us that we are on the first row
    $first = true;

    while( $qrow = mysql_fetch_assoc( $qr ) )
    {
        // Ok we are on the first row
        // lets make some headers of sorts
        if( $first )
        {
            foreach( $qrow as $k => $v )
            {
                // take the key and make label
                // make it uppper case and replace _ with ' '
                xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) );
                $col++;
            }

            // prepare for the first real data row
            $col = 0;
            $row++;
            $first = false;
        }

        // go through the data
        foreach( $qrow as $k => $v )
        {

            // write it out
            xlsWriteLabel( $row, $col, $v );
            $col++;
        }

        // reset col and goto next row
        $col = 0;
        $row++;

    }

    xlsEOF();

    //write the contents of the object to a file
    file_put_contents($filename, ob_get_clean());

    ?>

Merci pour tous les types d'aide !!!

est-il ou xls format de fichier xsl? me suis embrouillé.

  • Je suppose que c'est XLS:

D'abord: avez-vous besoin de mettre en place des styles de police, utilisez plusieurs onglets, utiliser des formules? Si alors essayez d'aller pour une bibliothèque Excel telles que phpwriteexcel.

Dans le cas contraire, un simple fichier csv est assez (Comma Separated Value, créé très facilement à partir des tableaux, lisez parfaitement avec Excel et d'autres logiciels de tableur).

Ensuite, pour l'enregistrer automatiquement sans demander:. Faire une tâche tâche / cron planifiée, appeler votre script

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top