Come creare un file Excel con PHP e MySQL

Apro una nuova sezione del portale dedicata allo sviluppo PHP che presto avrà una sezione dedicata. Creare un file Excel al volo con  php è molto semplice e tremendamente utile nel caso di sviluppo applicazioni orientate al business come piattaforme di BI o gestionali di vario tipo.

La soluzione si articola in 4 semplici passi;

  1. Esecuzione della Query con MySQL
  2. Formattazione delle righe in formato CSV
  3. Invio dell’opportuno Mime-Type
  4. Output

Esecuzione della Query con MySQL

Supponiamo di voler esportare in Excel un elenco clienti da un applicativo php/MySQl la prima cosa da fare sarà ovviamente la query sul db per l’estrazione dati, che sarà qualcosa di simile;

<?php
$hostname = "<host_db>";
$database = "<nome_db>";
$username = "<admin>";
$password= "<password>";
$conn= mysql_pconnect($hostname, $username, $password) or die(mysql_error());
mysql_select_db($database, $conn);
$query = "SELECT nome, cognome, citta FROM clienti";
$clienti = mysql_query($query, $conn) or die(mysql_error());
$row_clienti = mysql_fetch_assoc($clienti);
?>

Formattazione record CSV

A questo punto andiamo a formattare ogni riga separando i campi con la tabulazione ed includendo i campi di testo con i doppi apici. Il carattere speciale di tabulazione in php è "\t" e per includere i doppi apici useremo sempre lo slash;

<?php
do {
$righe.= "\"".$row_clienti[‘nome’]."\"\t\"".$row_clienti[‘cognome’]."\"\t\"".$row_clienti[‘citta’]."\"\n";
} while ($row_
clienti= mysql_fetch_assoc($clienti));
?>

L’invio del Mime-Type

Questa è la parte fondamentale di tutto il codice, l’invio del’header con il  Mime-Type adatto per Excel. Attenzione a non inviare nulla in output prima dell’header, pena il mancato funzionamento;

<?php 
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: nomefile.xls");
?>

e per finire, inviamo i dati e usciamo;

<?php 
print $righe;
exit; 
?>

Se è tutto impostato a dovere, quando si chiama il file non si apre nessuna nuova finestra, ma il browser invia un file CSV ed il sistema apre la classica maschera di salvataggio, quindi apre il foglio Excel con i dati. Ho provato anche ad inviare dati numerici con differenti formati e vengono letti benissimo. Basta utilizzare le funzioni di formattazione del php e non includere il dato nei doppi apici. Testato sia con Explore che con Firefox.