Eksport z bazy mysql do xls

Poniższy kod esportuje dane z podanej tabeli mysql do pliku xls (Excel).

$dbtable = "requests";

// This one makes the beginning of the xls file
function xlsBOF() {
	echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
	return;
}
 
// This one makes the end of the xls file
function xlsEOF() {
	echo pack("ss", 0x0A, 0x00);
	return;
}
 
// this will write text in the cell you specify
function xlsWriteLabel($Row, $Col, $Value) {
	$L = strlen($Value);
	echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
	echo $Value;
	return;
}
 
 
 
// make the connection an DB query
$dbc = mysql_connect($dbhost , $dbuser , $dbpass) or die(mysql_error());
mysql_select_db($dbname);
$q = "SELECT * FROM ".$dbtable;
$qr = mysql_query($q) or die(mysql_error());
 
 
// Ok now we are going to send some headers so that this
// thing that we are going make comes out of browser
// as an xls file.
//
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");
 
//this line is important its makes the file name
header("Content-Disposition: attachment;filename=export_".$dbtable.".xls ");
 
header("Content-Transfer-Encoding: binary ");
 
// start the file
xlsBOF();
 
// these will be used for keeping things in order.
$col = 0;
$row = 0;
 
// This tells us that we are on the first row
$first = true;
 
while($qrow = mysql_fetch_assoc($qr))
{
	// Ok we are on the first row
	// lets make some headers of sorts
	if($first)
	{
		foreach($qrow as $k => $v)
		{
			// take the key and make label
			// make it uppper case and replace _ with ' '
			xlsWriteLabel($row, $col, strtoupper(preg_replace("/_/" , "/ /" ,$k )));
			$col++;
		}
		 
		// prepare for the first real data row
		$col = 0;
		$row++;
		$first = false;
	}
	 
	// go through the data
	foreach($qrow as $k => $v)
	{
		// write it out
		xlsWriteLabel($row, $col, $v);
		$col++;
	}
	// reset col and goto next row
	$col = 0;
	$row++;
}
xlsEOF();
exit();
Źródło: http://snipplr.com/view/16324/ (z drobnymi przeróbkami)