Un moyen simple de transférer des données tabulaires de PHP vers Excel. Exporter des données de php vers Excel Exporter une table php vers Excel

.
La méthode présentée dans cette note est en effet très simple, mais n’est pas toujours pratique.
Il existe de nombreuses autres façons de transférer des données tabulaires de PHP vers Excel, je vais décrire celle qui m'a semblé la plus simple et la plus fonctionnelle. Il convient surtout de noter que je ne parle pas de générer un fichier xls, mais seulement de suggérer à l'utilisateur d'ouvrir les données reçues à l'aide d'Excel afin que les utilisateurs non expérimentés en programmation ne remarquent pas la contrefaçon.

Ainsi, la première chose que vous devez faire est de placer sur notre page un lien vers un script qui génère les en-têtes suivants :
en-tête("Pragma : public");
en-tête("Expire : 0");
header("Cache-Control : doit-revalider, post-check=0, pre-check=0");
header("Cache-Control : privé", false);
header("Type de contenu : application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
en-tête("Content-Transfer-Encoding : binaire");
header("Content-Length: " . $object->getFileSize());

$object est un objet sphérique dans le vide, que chaque lecteur peut implémenter à sa guise. Le but des getters getFileName() et getFileSize() ressort clairement de leurs noms. Il convient de souligner ici une nuance non évidente (merci de me le rappeler) - getFileName() peut bien sûr renvoyer n'importe quel nom de fichier, mais si vous souhaitez que le navigateur propose d'ouvrir le contenu reçu dans Excel, alors l'extension de fichier doit être xls.
Je n’ai encore rien dit de nouveau, tout cela a pourtant été inventé avant moi, comme ce qui sera décrit ci-dessous.
Comme cela a été noté à juste titre dans les commentaires de l'article, Excel fonctionne beaucoup plus rapidement avec XML. Mais l’avantage le plus important n’est peut-être pas la vitesse, mais des capacités beaucoup plus larges. Je n'entrerai pas dans les détails, mais je donnerai juste un exemple simple et un lien vers description détaillée toutes les balises.

Ainsi, une fois les en-têtes générés, nous devons fournir les données réelles à l'utilisateur. J'enveloppe généralement la génération de table dans une méthode distincte :
echo $object->getContent();

Et je génère le tableau en utilisant Smarty :

(foreach from=$data.header item=caption) ($caption.columnName)(/pour chaque)(foreach from=$data.content item=row) (foreach from=$ligne élément=col) ($col)(/pour chaque)(/pour chaque)

Comme vous pouvez le voir dans le code, le tableau $data est transmis au modèle, contenant deux tableaux : la ligne de titre du tableau et les données elles-mêmes.
Il convient de noter que l’utilisation d’un moteur de modèles uniquement pour générer du XML est quelque peu coûteuse et que le XML peut être obtenu de nombreuses autres manières. Dans mon cas particulier, la génération XML n'est qu'un petit plus dans un grand projet où un moteur de template est indispensable.

Comme exemple j'ai donné le tableau le plus simple, de nombreux autres attributs peuvent être manipulés si vous le souhaitez. C'est particulièrement intéressant étant donné qu'aucune bibliothèque tierce n'est requise pour la mise en œuvre.
La méthode décrite fonctionne sur un projet depuis plusieurs années et aucun utilisateur n'a encore soupçonné que les données qu'il ouvre ne sont pas un document MS Office.

Vous pouvez en savoir plus sur la structure XML utilisée dans MS Excel dans

(données obtenues à partir de la base de données MySQL) pour réussir. J'utilise Zend Framework. Je dois apporter quelques modifications à mes données avant de les exporter vers Excel. En fait, j'ai besoin de créer un livre de caisse mensuel.

J'ai lu beaucoup de documents mais je me suis retrouvé dans le pétrin. Je ne sais vraiment pas par où commencer. Ai-je vraiment besoin de PEAR ? Dois-je charger une bibliothèque de classes ? N'est-ce pas manière simple faire ça ?

Merci d'avance

Je vous suggère d'utiliser la bibliothèque PHPExcel. Il est vraiment puissant, prend en charge plusieurs formats, peut effectuer un formatage visuel et est facile à utiliser.

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

Exemple d'utilisation :

$objPHPExcel = nouveau PHPExcel(); /** Vous pouvez définir de nombreuses propriétés */ $objPHPExcel->getProperties()->setCreator("Mon entreprise") ->setLastModifiedBy("John Doe") ->setTitle("Rapport annuel") ->setSubject("Sales ") ->setDescription("Rapport annuel des ventes de John Doe") ->setCategory("Finance"); /** Choisissez l'une des feuilles */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Définissez simplement la valeur de la cellule */ $activeSheet->setCellValue("A1", "plural");

Vous pouvez bien sûr faire bien plus en lisant fichiers Excel, définition de styles visuels, création de graphiques, d'expressions et bien plus encore.

J'ai écrit un rapport de variation d'inventaire de 94 lignes dans lequel je prends des données de MySQL (6 Ko + enregistrements par table), crée tableau multidimensionnelà partir de données MySQL, extraites de plusieurs tables, puis tout vidé sur une seule ligne et généré .xls de cette façon :

Aucune extension requise.

Les seules réserves sont que je n'ai pas encore compris comment cracher des fichiers .xls sans Excel, signalant que les données peuvent être corrompues - et je n'ai pas essayé de faire du formatage ou quoi que ce soit de plus complexe que simplement "exporter" les données, Fichier/données ok bien sûr, mais cela génère un avertissement d'Excel.

EDIT : je dois noter que "setup" et "dump" font référence à ce qui suit : daniweb.com

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

pour l'intégration de Zend, vous pouvez utiliser l'aide du lien suivant.

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

Le CSV ressemble à ceci :

"le contenu de ma première cellule", "le contenu de ma deuxième cellule", "le contenu de ma troisième cellule" "la deuxième ligne, le contenu de la première cellule", "etc", "etc

Chaque ligne représente une ligne Excel, vous placez le contenu de la cellule entre guillemets doubles et séparez par des virgules. Soyez prudent si vous disposez de certaines de vos données, cela peut casser votre CSV et créer de nouvelles lignes indésirables.

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

Préparation des 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 à générer les données au format délimité par des tabulations (CSV peut également être utilisé, mais c'est un peu plus compliqué). Pour ce faire nous utilisons le code suivant :

Nous définissons le type de contenu sur text/plain afin que le résultat puisse être visualisé plus facilement dans le navigateur. Sinon, puisqu’il n’y a pas de formatage HTML, la sortie apparaîtra sous la forme d’une seule ligne de texte.

La première ligne de sortie sera les en-têtes de colonnes (dans ce cas, les noms de champs sont utilisés). Les valeurs sont séparées par une tabulation \t et des lignes avec des sauts de ligne \n. Le résultat devrait ressembler à ceci :

Prénom nom âge Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Il y a une faiblesse dans ce code qui n’est peut-être pas immédiatement évidente. Que se passe-t-il si l'un des champs à afficher contient déjà un ou plusieurs caractères de tabulation ou, pire encore, nouvelle ligne? Cela déclenchera tout le processus puisque nous comptons sur ces symboles pour indiquer les colonnes et les sauts de ligne.

La solution consiste à "échapper" aux caractères de tabulation. Dans ce cas, nous remplacerons les tabulations par le littéral \t et les sauts de ligne par le littéral \n afin qu'ils n'affectent pas le formatage :

Désormais, avant que chaque ligne ne soit répercutée, tous les caractères de tabulation sont remplacés par "\t" afin que nos colonnes ne soient pas interrompues. De plus, tous les sauts de ligne dans les données sont remplacés par "\n".

Pour beaucoup, lorsqu'ils travaillent avec PHP en conjonction avec MySQL il existe un besoin tel que l'exportation des données de la base de données au format xls, afin que les personnes qui ont besoin de ces données les traitent Programme Excel ou il était simplement pratique pour les utilisateurs de visualiser ces données. Récemment, j'ai eu un tel besoin et aujourd'hui je vais vous expliquer comment cette question peut être mise en œuvre.

Je dirai tout de suite que cette méthode est assez simple, mais les données sont téléchargées normalement.

Pour commencer, je vais donner un exemple du fichier xls final ; dans Excel, le téléchargement ressemblera à ceci :

En d’autres termes, aucune image ou style ne sera téléchargé, uniquement les en-têtes de colonnes et les données elles-mêmes.

Avant d'arriver exactement à cette option de téléchargement, j'ai essayé de télécharger au format csv, mais cela s'est avéré un peu maladroit, puis j'ai essayé de dessiner un tableau et de l'enregistrer avec l'extension xls, cela s'est également avéré être une sorte d'absurdité , la méthode que je vais maintenant décrire me convenait parfaitement, et maintenant je vais la partager avec vous.

Pour commencer, je vais vous donner tout le code, que j'ai commenté au maximum, vous pouvez le sélectionner et le sauvegarder avec extension php et essayez, n'oubliez pas de spécifier les paramètres de connexion à la base de données.

Exporter des données de MySQL vers Excel en PHP

Et pour que vous compreniez quelles données je télécharge, je vais donner un exemple de table simple dans la base de données ( J'ai son nom test):

Tableau d'essai :

identifiant prénom nom
1 Ivanov Ivan
2 Petrov Pierre
2 Petrov2 Pierre2
xlsData = pack("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0);

) // Si la fonction numérique RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); ) //Si la fonction texte RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack (" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return ) // Insérer une fonction numérique InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ value); $this->countCol++; return; ) // Insérer une fonction de texte InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this- >countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++ return; countCol = 0 ; $this->countRow++; return; ) //Fin de la fonction de données EndData() ( $this->xlsData .= pack("ss", 0x0A, 0x00); retour; ) // Enregistrez la fonction de fichier SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Envoyez la fonction de fichier SendFile())( $this->EndData(); en-tête (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); en-tête ("Cache-Control : pas de stockage, pas de cache, revalidation obligatoire"); header ("Pragma : pas de cache"); header("Type de contenu : application/x-msexcel"); header("Disposition du contenu : pièce jointe; fileName=$this->fileName.xls"); ->xlsData ; ) ) ) if(isset($_GET["id"])) ( // filtrer les données $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))) ; $filename = "File_with_id_".$id; // définit le nom du fichier $excel = new ExportToExcel(); // crée une instance de la classe $sql="SELECT * FROM test.test où id = $id"; //requête vers la base de données $rez= mysql_query($sql); $excel->InsertText("Identifier"); $excel->InsertText("Last Name"); excel->GoNewLine(); row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]);$excel->InsertText($row["firstname"]); $excel->InsertText($row["nom"]);$excel->GoNewLine(); ) $excel->SaveFile($filename);.

Afin de vérifier la fonctionnalité de ce code, compte tenu du fait que vous avez configuré une connexion à la base de données et créé une table similaire, vous pouvez envoyer la requête suivante :

Http://votre_site/nom_fichier. php?id=2

Et vous devez décharger deux lignes avec un identifiant égal à 2.

Et désormais, toute personne que vous autorisez à télécharger des données peut facilement les exporter vers son ordinateur localà travers interface internet. Cette méthode convient aussi bien aux utilisateurs d'entreprise, si vous développez une application pour votre organisation, qu'aux utilisateurs de votre site Web sur Internet. Espoir, cette méthode Je vous ai aidé. Bonne chance!

.
La méthode présentée dans cette note est en effet très simple, mais n’est pas toujours pratique.
Il existe de nombreuses autres façons de transférer des données tabulaires de PHP vers Excel, je vais décrire celle qui m'a semblé la plus simple et la plus fonctionnelle. Il convient surtout de noter que je ne parle pas de générer un fichier xls, mais seulement de suggérer à l'utilisateur d'ouvrir les données reçues à l'aide d'Excel afin que les utilisateurs non expérimentés en programmation ne remarquent pas la contrefaçon.

Ainsi, la première chose que vous devez faire est de placer sur notre page un lien vers un script qui génère les en-têtes suivants :
en-tête("Pragma : public");
en-tête("Expire : 0");
header("Cache-Control : doit-revalider, post-check=0, pre-check=0");
header("Cache-Control : privé", false);
header("Type de contenu : application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
en-tête("Content-Transfer-Encoding : binaire");
header("Content-Length: " . $object->getFileSize());

$object est un objet sphérique dans le vide, que chaque lecteur peut implémenter à sa guise. Le but des getters getFileName() et getFileSize() ressort clairement de leurs noms. Il convient de souligner ici une nuance non évidente (merci à savostin de me l'avoir rappelé) - getFileName() peut bien sûr renvoyer n'importe quel nom de fichier, mais si vous souhaitez que le navigateur propose d'ouvrir le contenu reçu dans Excel, alors le fichier l'extension devrait être xls.
Je n’ai encore rien dit de nouveau, tout cela a pourtant été inventé avant moi, comme ce qui sera décrit ci-dessous.
Comme cela a été noté à juste titre dans les commentaires de l'article sur la génération xls en PHP, Excel fonctionne beaucoup plus rapidement avec XML. Mais l’avantage le plus important n’est peut-être pas la vitesse, mais des capacités beaucoup plus larges. Je n'entrerai pas dans les détails, mais je donnerai simplement un exemple simple et un lien vers une description détaillée de toutes les balises.

Ainsi, une fois les en-têtes générés, nous devons fournir les données réelles à l'utilisateur. J'enveloppe généralement la génération de table dans une méthode distincte :
echo $object->getContent();

Et je génère le tableau en utilisant Smarty :

(foreach from=$data.header item=caption) ($caption.columnName)(/pour chaque)(foreach from=$data.content item=row) (foreach from=$ligne élément=col) ($col)(/pour chaque)(/pour chaque)

Comme vous pouvez le voir dans le code, le tableau $data est transmis au modèle, contenant deux tableaux : la ligne de titre du tableau et les données elles-mêmes.
Il convient de noter que l’utilisation d’un moteur de modèles uniquement pour générer du XML est quelque peu coûteuse et que le XML peut être obtenu de nombreuses autres manières. Dans mon cas particulier, la génération XML n'est qu'un petit plus dans un grand projet où un moteur de template est indispensable.

A titre d'exemple, j'ai donné un tableau simple ; si vous le souhaitez, vous pouvez manipuler un nombre beaucoup plus grand d'attributs. C'est particulièrement intéressant étant donné qu'aucune bibliothèque tierce n'est requise pour la mise en œuvre.
La méthode décrite fonctionne sur un projet depuis plusieurs années et aucun utilisateur n'a encore soupçonné que les données qu'il ouvre ne sont pas un document MS Office.

Vous pouvez en savoir plus sur la structure XML utilisée dans MS Excel dans