### **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;
}