재인쇄: http://blog.csdn.net/huyanping/article/details/7068356
데이터베이스에서 Excel 파일로 데이터를 내보내야 하는 경우가 종종 있습니다. PHPExcel과 같은 일부 오픈 소스 라이브러리를 사용하면 실제로 구현하기가 더 쉽지만 대량의 데이터에 대한 지원은 매우 열악하며 PHP 메모리 사용량의 상한에 도달하기 쉽습니다. 여기서의 방법은 fputcsv를 이용하여 CSV 파일을 작성하고, 엑셀 파일을 브라우저에 직접 출력하는 방법입니다.
//Excel 파일 헤더를 출력하고, user.csv를 원하는 파일 이름으로 바꾸면 됩니다
header('Content-Type: application/vnd.ms-excel');
header ( 'Content-Disposition: attachment;filename="user.csv"');
header('Cache-Control: max-age=0');
// 데이터베이스에서 데이터를 가져옵니다. 메모리를 절약하세요. 데이터를 한 번에 메모리에 넣지 말고 핸들에서 한 줄씩 읽어보세요.
$sql = 'select * from tbl where ...'; $stmt = $db- >query($sql);
// PHP 파일 핸들을 엽니다. php://output은 브라우저에 직접 출력한다는 의미입니다.
$fp = fopen('php://output', 'a') ;
// 엑셀 컬럼 이름 정보 출력
$head = array('이름', '성별', '나이', '이메일', '전화', '...');
foreach ($head as $i => $ v) {
// CSV Excel은 GBK 인코딩을 지원하므로 변환해야 합니다. 그렇지 않으면 코드가 깨집니다.
$head[$i] = iconv('utf-8 ', 'gbk', $v);
}
//fputcsv를 통해 파일 핸들에 데이터 쓰기
fputcsv($fp, $head);
//Counter
$cnt = 0;
//$limit 라인마다 너무 크지도 작지도 않게 출력 버퍼를 새로 고칩니다.
$limit = 100000;
// 메모리 낭비 없이 한 줄씩 데이터를 가져옵니다
while ($row = $stmt->fetch( Zend_Db::FETCH_NUM)) {
$cnt ++;
if ($limit == $cnt) { //다음으로 인한 문제를 방지하기 위해 출력 버퍼를 새로 고칩니다. 데이터가 너무 많습니다
ob_flush();
플러시();
$cnt = 0;
}
foreach ($row as $i => $v) {
$ row[$i] = iconv('utf- 8', 'gbk', $v);
}
fputcsv($fp, $row);
}