### **PHP fputcsv() 函數**
定義:fputcsv() 函數將行格式化為 CSV 并寫入一個打開的文件。
該函數返回寫入字符串的長度。若出錯,則返回 false。
方法一:
function export()
{
set_time_limit(0);
ini_set('memory_limit', '256M');
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="' . 'aa.csv' . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
//打開php數據輸入緩沖區
$fp = fopen('php://output', 'a');
$heade = ['姓名', '性別', '手機號'];
//將數據編碼轉換成GBK格式
mb_convert_variables('GBK', 'UTF-8', $heade);
//將數據格式化為CSV格式并寫入到output流中
fputcsv($fp, $heade);
$data = [
['小明', '男', 17699019191],
['小紅', '男', 17699019191],
['小黑', '女', 17699019191],
['小白', '女', 17699019191],
];
//如果在csv中輸出一個空行,向句柄中寫入一個空數組即可實現
foreach ($data as $row) {
//將數據編碼轉換成GBK格式
mb_convert_variables('GBK', 'UTF-8', $row);
fputcsv($fp, $row);
//將已經存儲到csv中的變量數據銷毀,釋放內存
unset($row);
}
//關閉句柄
fclose($fp);
die;
}
方法二:
/*
* 該方法是把數據庫讀出的數據進行CSV文件輸出,能接受百萬級別的數據輸出,因為用生成器,不用擔心內存溢出。
* @param string $sql 需要導出的數據SQL
* @param string $mark 生成文件的名字前綴
*
*/
function putCsv($data, $mark)
{
set_time_limit(0);
header('Content-Type: application/vnd.ms-excel;charset=utf-8');
header('Content-Disposition: attachment;filename="' . $mark . '"');
header('Cache-Control: max-age=0');
$file_num = 0; //文件名計數器
$fileNameArr = array();
$fp = fopen($mark .'_'.$file_num .'.csv', 'w'); //生成臨時文件
$fileNameArr[] = $mark .'_'.$file_num .'.csv';
fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));//轉碼,防止亂碼
foreach ($data as $a) {
fputcsv($fp, $a);
}
fclose($fp); //每生成一個文件關閉
}
$data = [
['序號','姓名','年齡','性別'],
['111','vance','18','boy'],
['222','ashe','22','girl']
];
$mark = 'test.csv';
putCsv($data,$mark);
方法三:
function exportWarehouseManagementToExcel()
{
ini_set('max_execution_time', 300);// 設置PHP超時時間
ini_set('memory_limit', '2048M');// 設置PHP臨時允許內存大小
$queryResult = [
['100001','藍牌','安徽','可用','2019-9-8']
];
//路徑
$fileName = '車管駐點業務寄遞倉庫管理所有數據' . date('Ymd_His') . '.csv';
$filePath = $fileName;
$index = 0;
$fp = fopen($filePath, 'w'); //生成臨時文件
chmod($filePath, 0777);//修改可執行權限
// 將數據通過fputcsv寫到文件句柄
$header = array('車牌號碼', '車牌類型', '所在區域', '狀態', '入庫時間');//設置表頭
fputcsv($fp, $header);
//處理導出數據
foreach ($queryResult as $key => &$val) {
foreach ($val as $k => $v) {
$val[$k] = $v . "\t";
if ($index == 10000) { //每次寫入1000條數據清除內存
$index = 0;
ob_flush();//清除內存
flush();
}
$index++;
}
fputcsv($fp, $val);
}
ob_flush();
fclose($fp); //關閉句柄
header("Cache-Control: max-age=0");
header("Content-type:application/vnd.ms-excel;charset=UTF-8");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=' . basename($fileName));
header("Content-Type: text/csv");
header("Content-Transfer-Encoding: binary");
header('Content-Length: ' . filesize($filePath));
@readfile($filePath);//輸出文件;
unlink($filePath); //刪除壓縮包臨時文件
echo $filePath;
return;
}