Può capitare di dover esportare dalla propria web application dati nell’amato/odiato formato di mamma Microsoft.

Di solito utilizzavo una soluzione ‘sporca’: realizzavo la pagina in modo da visualizzare una semplice tabella html contenente i dati e aggiungevo in testa allo script un bel

header(“Content-Disposition:attachment;filename=file.xls”);

facendo in modo che il browser salvasse la pagina così creata con estensione .xls.

Excel riusciva a leggere senza problemi l’html e visualizzava la tabella mantenendo anche la formattazione.

In giro sul web trovo però quest’ altro metodo , che permette di salvare direttamente in formato excel, senza strani giri.

Si creano quindi delle funzioni adatte alla formattazione:

function xlsBOF() { echo pack(“ssssss”, 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; }

function xlsEOF() { echo pack(“ss”, 0x0A, 0x00); return; }

function xlsWriteNumber($Row, $Col, $Value) { echo pack(“sssss”, 0x203, 14, $Row, $Col, 0x0); echo pack(“d”, $Value); return; }

function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack(“ssssss”, 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; return; }

Dopodichè si richiamano nella creazione del file (nell’esempio vengono pescati i dati da un database):

// Query Database $result=mysql_db_query($dbname,”select id,prename,name,sname,grade from appdata where course=’$courseid’ and sec=’$section’”)

// Send Header 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”);; header(“Content-Disposition: attachment;filename=$courseid-$sec.xls”); header(“Content-Transfer-Encoding: binary “);

// XLS Data Cell

xlsBOF(); xlsWriteLabel(1,0,”Student Register $semester/$year”); xlsWriteLabel(2,0,”COURSENO : “); xlsWriteLabel(2,1,”$courseid”); xlsWriteLabel(3,0,”TITLE : “); xlsWriteLabel(3,1,”$title”); xlsWriteLabel(4,0,”SETION : “); xlsWriteLabel(4,1,”$sec”); xlsWriteLabel(6,0,”NO”); xlsWriteLabel(6,1,”ID”); xlsWriteLabel(6,2,”Gender”); xlsWriteLabel(6,3,”Name”); xlsWriteLabel(6,4,”Lastname”); $xlsRow = 7; while(list($id,$prename,$name,$sname,$grade)=mysql_fetch_row($result)) { ++$i; xlsWriteNumber($xlsRow,0,”$i”); xlsWriteNumber($xlsRow,1,”$id”); xlsWriteLabel($xlsRow,2,”$prename”); xlsWriteLabel($xlsRow,3,”$name”); xlsWriteLabel($xlsRow,4,”$sname”); $xlsRow++; } xlsEOF(); exit();

Semplice e indolore… :-)