web-dev-qa-db-fra.com

Exporter des données de PHP vers Excel

J'ai besoin d'exporter des données de php (données récupérées de la base de données mysql) vers Excel. J'utilise Zend Framework. Je dois apporter quelques modifications à mes données avant d'exporter vers Excel. En fait, ce dont j'ai vraiment besoin, c'est de générer un livre de caisse mensuel.

J'ai lu beaucoup de documents, mais je me suis retrouvé dans un désordre. Je ne comprends vraiment pas comment commencer. Ai-je vraiment besoin de PEAR? Dois-je télécharger une bibliothèque de classes? N'y a-t-il pas un moyen simple de le faire?

Merci d'avance

14
PHP-Zend

Je vous suggère d'utiliser une grande bibliothèque PHPExcel. Il est vraiment puissant, prend en charge une variété de formats, peut faire un formatage visuel et est facile à utiliser.

Vous pouvez en savoir plus sur leur page Web: http://phpexcel.codeplex.com/. (PHPExcel a déjà déménagé à https://github.com/PHPOffice/PHPExcel )

Exemple d'utilisation:

    $objPHPExcel = new PHPExcel();
    /** You can set many properties */
    $objPHPExcel->getProperties()->setCreator("My company")
                 ->setLastModifiedBy("John Doe")
                 ->setTitle("Annual report")
                 ->setSubject("Sales")
                 ->setDescription("Annual sales report by John Doe")
                 ->setCategory("Finance");

    /** Choose one of sheets */
    $activeSheet = $objPHPExcel->setActiveSheetIndex(0);
    /** Simply set value of cell */
    $activeSheet->setCellValue("A1", 'plural');

Vous pouvez bien sûr faire beaucoup plus, lire des fichiers Excel, définir des styles visuels, créer des tracés, des expressions et bien plus encore.

28
Samuel Hapak

J'ai écrit un rapport sur les écarts d'inventaire de 94 lignes dans lequel j'attrape des données de MySQL (6k + enregistrements par table), crée un tableau multidimensionnel à partir des données MySQL tirées de plusieurs tables, puis tout vider dans une seule chaîne et générer un .xls ainsi:

<?php
////////////////////////////////// BEGIN SETUP
    $filename ="document_name.xls";
    header('Content-type: application/ms-Excel');
    header('Content-Disposition: attachment; filename='.$filename);
////////////////////////////////// END SETUP
////////////////////////////////// BEGIN GATHER
    // Your MySQL queries, fopens, et cetera go here.
    // Cells are delimited by \t
    // \n is just like you might expect; new line/row below
    // E.G:
    $stuff="PART\tQTY\tVALUE\t\n";
    $stuff=$stuff."01-001-0001\t37\t28.76\t\n";
    $stuff=$stuff."01-001-0002\t6\t347.06\t\n";
    $stuff=$stuff."01-001-0003\t12\t7.11\t\n";
////////////////////////////////// END GATHER
// The point is to get all of your data into one string and then:
////////////////////////////////// BEGIN DUMP
    echo $stuff;
////////////////////////////////// END DUMP
?>

Aucune extension requise.

Les seules mises en garde sont que je n'ai pas encore compris comment cracher un .xls sans que Excel me dise que les données peuvent être corrompues - et je n'ai pas essayé de faire un formatage ou quelque chose de plus complexe que de simplement "exporter" les données . Le fichier/données est bien sûr, mais il génère un avertissement à partir d'Excel.

EDIT: je devrais noter que le 'setup' et le 'dump' sont les suivants: daniweb.com

4
ytilanigiroon

Vous pouvez utiliser la bibliothèque phpexcel . Il vous permet d'écrire et de lire à partir de différents formats de fichiers de feuille de calcul

pour l'intégration avec zend, vous pouvez obtenir de l'aide en suivant link .

3
Vinay

Avec un peu de Google, vous auriez trouvé ceci: http://www.the-art-of-web.com/php/dataexport/

Préparer les données

$data = array(
    array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
    array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
    array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
    array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
    array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
    array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
    array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);

La première étape consiste à sortir les données dans un format délimité par des tabulations (CSV peut également être utilisé mais est légèrement plus compliqué). Pour ce faire, nous utilisons le code suivant:

<?php
    header("Content-Type: text/plain");

    $flag = false;
    foreach( $data as $row ) {
        if( !$flag ) {
        // display field/column names as first row
        echo implode( "\t", array_keys( $row ) ) . "\r\n";
        $flag = true;
    }
    echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;

?>

Nous définissons le type de contenu sur text/plain afin que la sortie puisse être plus facilement visualisée dans le navigateur. Sinon, car il n'y a pas de mise en forme HTML, la sortie apparaîtra comme une seule ligne de texte.

La première ligne de sortie sera les en-têtes de colonne (dans ce cas, les noms de champ sont utilisés). Les valeurs sont séparées par un onglet\t et les lignes par un saut de ligne\n. La sortie doit ressembler à ceci:

firstname  lastname  age
Mary Johnson 25 
Amanda Miller 18 
James Brown 31 
Patricia    Williams     7 
Michael Davis 43 
Sarah Miller 24 
Patrick Miller 27

Il y a déjà une faiblesse dans ce code qui n'est peut-être pas immédiatement évidente. Et si l'un des champs à sortir contient déjà un ou plusieurs tabulations, ou pire, une nouvelle ligne? Cela va jeter tout le processus car nous comptons sur ces caractères pour indiquer les sauts de colonne et de ligne.

La solution consiste à "échapper" les caractères de tabulation. Dans ce cas, nous allons remplacer les tabulations par un littéral\t et les sauts de ligne par un littéral\n afin qu'ils n'affectent pas la mise en forme:

<?php
    function cleanData( &$str ) {
        $str = preg_replace( "/\t/", "\\t", $str );
        $str = preg_replace("/\r?\n/", "\\n", $str);
    }

    header("Content-Type: text/plain");
    $flag = false;
    foreach( $data as $row ) {
        if( !$flag ) {
            // display field/column names as first row
            echo implode( "\t", array_keys( $row ) ) . "\r\n";
            $flag = true;
        }
        array_walk( $row, 'cleanData' );
        echo implode( "\t", array_values( $row ) ) . "\r\n";
    }
    exit;

?>

Maintenant, avant que chaque ligne ne fasse écho, tous les caractères de tabulation sont remplacés "\ t" afin que nos colonnes ne soient pas divisées. De plus, tout saut de ligne dans les données est remplacé par "\ n".

2
Peon

Vous pouvez utiliser CSV pour créer un format importable pour Excel. C'est la façon la plus simple de le faire.

CSV ressemble à ceci:

"my first cellcontent", "my second cell content", "my third cell content"
"second line, first cell content", "etc", "etc

Chaque ligne représente une ligne Excel, vous mettez le contenu des cellules entre guillemets doubles et séparé par des virgules. Faites attention à \r\n si vous en avez dans vos données, cela peut casser votre CSV et créer de nouvelles lignes indésirables.

2
zessx