要點(diǎn):
1.header頭的設(shè)置,正確的設(shè)置可以防止導(dǎo)出的csv文件內(nèi)容出現(xiàn)亂碼
2.有了正確的header頭設(shè)置不需要再去使用iconv函數(shù)去轉(zhuǎn)換字符編碼
3.輸出文件名的設(shè)置(這個(gè)會(huì)體現(xiàn)在代碼中)
4.逐行取數(shù)據(jù),防止數(shù)據(jù)過(guò)多造成內(nèi)存溢出等的問(wèn)題
5.計(jì)數(shù)器和buffer刷新閾值的設(shè)定
6.fputcsv()函數(shù)的使用;
7.ob_flush()函數(shù)和flush()函數(shù)的使用;
代碼簡(jiǎn)單易懂,因?yàn)閹缀趺啃卸加凶⑨?/h5>
public function exportCsv($data){
//設(shè)置header頭信息
header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Type: application/vnd.ms-excel');
$file_name = date('YmdHis').'.csv';
header('Content-Disposition: attachment;filename="'.$file_name.'"');
// 打開(kāi)PHP文件句柄,php://output 表示直接輸出到瀏覽器
$fp = fopen('php://output', 'a');
//設(shè)置csv文件表頭
$table_header = array('券碼','核銷金額','訂單號(hào)','核銷時(shí)間','商品名稱','核銷員');
// 將數(shù)據(jù)通過(guò)fputcsv寫(xiě)到文件句柄
fputcsv($fp, $table_header);
//計(jì)數(shù)器
$cnt = 0;
//buffer刷新間隔
$flush = 500;
//逐行取出數(shù)據(jù)
$count = count($data);
for ($i = 0;$i<$count;$i++){
//刷新一下輸出buffer,防止由于數(shù)據(jù)過(guò)多造成問(wèn)題
if($flush == $cnt){
ob_flush();
flush();
$cnt = 0;//重置計(jì)數(shù)器
}
$row = $data[$i];//根據(jù)主鍵逐行取數(shù)據(jù)
$row['virtual_code'] = '='.'"'.$row['virtual_code'].'"';//防止這個(gè)值被excel自動(dòng)轉(zhuǎn)換所作的處理
$row['virtual_time'] = '='.'"'.$row['virtual_time'].'"';//防止這個(gè)值被excel自動(dòng)轉(zhuǎn)換所作的處理
//將數(shù)據(jù)格式化為CSV,并寫(xiě)入文件指針
fputcsv($fp,$row);
$cnt += 1;
}
//關(guān)閉打開(kāi)的文件
fclose($fp);
}
補(bǔ)充
-
導(dǎo)出的數(shù)據(jù)比如比較長(zhǎng)的純數(shù)字,日期在Excel中會(huì)被自動(dòng)轉(zhuǎn)換,如下圖
純數(shù)字被轉(zhuǎn)換.png
日期被轉(zhuǎn)換.png
解決辦法:
- 在不希望被自動(dòng)轉(zhuǎn)換的值前邊拼接加上
=號(hào),比如:
時(shí)間可以這么處理:
=2018-7-12(注意等于號(hào))
效果:
純數(shù)字的效果.png
時(shí)間的效果.png
over
public function exportCsv($data){
//設(shè)置header頭信息
header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Type: application/vnd.ms-excel');
$file_name = date('YmdHis').'.csv';
header('Content-Disposition: attachment;filename="'.$file_name.'"');
// 打開(kāi)PHP文件句柄,php://output 表示直接輸出到瀏覽器
$fp = fopen('php://output', 'a');
//設(shè)置csv文件表頭
$table_header = array('券碼','核銷金額','訂單號(hào)','核銷時(shí)間','商品名稱','核銷員');
// 將數(shù)據(jù)通過(guò)fputcsv寫(xiě)到文件句柄
fputcsv($fp, $table_header);
//計(jì)數(shù)器
$cnt = 0;
//buffer刷新間隔
$flush = 500;
//逐行取出數(shù)據(jù)
$count = count($data);
for ($i = 0;$i<$count;$i++){
//刷新一下輸出buffer,防止由于數(shù)據(jù)過(guò)多造成問(wèn)題
if($flush == $cnt){
ob_flush();
flush();
$cnt = 0;//重置計(jì)數(shù)器
}
$row = $data[$i];//根據(jù)主鍵逐行取數(shù)據(jù)
$row['virtual_code'] = '='.'"'.$row['virtual_code'].'"';//防止這個(gè)值被excel自動(dòng)轉(zhuǎn)換所作的處理
$row['virtual_time'] = '='.'"'.$row['virtual_time'].'"';//防止這個(gè)值被excel自動(dòng)轉(zhuǎn)換所作的處理
//將數(shù)據(jù)格式化為CSV,并寫(xiě)入文件指針
fputcsv($fp,$row);
$cnt += 1;
}
//關(guān)閉打開(kāi)的文件
fclose($fp);
}
導(dǎo)出的數(shù)據(jù)比如比較長(zhǎng)的純數(shù)字,日期在Excel中會(huì)被自動(dòng)轉(zhuǎn)換,如下圖

純數(shù)字被轉(zhuǎn)換.png

日期被轉(zhuǎn)換.png
=號(hào),比如:時(shí)間可以這么處理:
=2018-7-12(注意等于號(hào))
純數(shù)字的效果.png

時(shí)間的效果.png