Nachdruck: http://blog.csdn.net/huyanping/article/details/7068356
Wir stoßen oft auf die Notwendigkeit, Daten aus einer Datenbank in eine Excel-Datei zu exportieren. Die Verwendung einiger Open-Source-Bibliotheken wie PHPExcel ist zwar einfacher zu implementieren, aber die Unterstützung für große Datenmengen ist sehr schlecht, und das ist auch der Fall leicht, die Obergrenze der PHP-Speichernutzung zu erreichen. Die Methode hier besteht darin, mit fputcsv CSV-Dateien zu schreiben und Excel-Dateien direkt an den Browser auszugeben.
//Geben Sie den Excel-Datei-Header aus. Sie können user.csv durch den gewünschten Dateinamen ersetzen
header('Content-Type: application/vnd.ms-excel');
header ( 'Content-Disposition: attachment;filename="user.csv"');
header('Cache-Control: max-age=0');
// Daten aus der Datenbank abrufen, um Speicher sparen, Daten nicht auf einmal in den Speicher einlesen, sondern nur Zeile für Zeile aus dem Handle lesen
$sql = 'select * from tbl where ...'; >query($sql);
// PHP-Dateihandle öffnen, php://output bedeutet Ausgabe direkt an den Browser
$fp = fopen('php://output', 'a') ;
// Informationen zum Excel-Spaltennamen ausgeben
$head = array('Name', 'Gender', 'Age', 'Email', 'Telephone', '...');
foreach ($head as $i => $ v) {
// CSV Excel unterstützt GBK-Kodierung, muss konvertiert werden, sonst wird der Code verstümmelt
$head[$i] = iconv('utf-8 ', 'gbk', $v);
}
// Daten über fputcsv in das Dateihandle schreiben
fputcsv($fp, $head);
// Zähler
$cnt = 0;
// Jede $limit-Zeile den Ausgabepuffer aktualisieren, nicht zu groß, nicht zu klein
$limit = 100000;
// Daten Zeile für Zeile abrufen, ohne Speicher zu verschwenden
while ($row = $stmt->fetch( Zend_Db::FETCH_NUM)) {
$cnt ;
if ($limit == $cnt) { //Aktualisieren Sie den Ausgabepuffer, um Probleme zu vermeiden, die durch zu viel verursacht werden data
ob_flush();
flush();
$cnt = 0;
}
foreach ($row as $i => $v) {
$row[ $i] = iconv('utf-8' , 'gbk', $v);
}
fputcsv($fp, $row);
}