Cerca nel blog

11 novembre, 2006

Come Creare Un File Excel Con PHP E MySQL

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 = "";
$database = "";
$username = "";
$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 Internet Explorer che con Firefox.

Tratto da: ikaro.net

2 commenti:

Ste ha detto...

Ciao,

il tuo post è stato molto utile, ma se io avessi la necessità di inviare quel file via mail invece che farlo scaricare tramite browser?E' fattibile?

Grazie
Stefano

Francesco ha detto...

Umh...è più complicato.
Puoi dare un'occhiata alla classe phpmailer (phpmailer.sourceforge.net).

Qui trovi un esempio di come usarla:

http://www.sastgroup.com/tutorials/inviare-email-con-allegato-in-php-2

Chiaramente, dovrai sostituire l'allegato pippo.zip con nomefile.xls.
Ciao!