PHP匯出CSV檔案
優點
- 匯出檔案資料大
- csv檔案體積比excel小
- 相比於PHPExcel 外掛佔用記憶體少
缺點
- 直接使用excel軟體開啟,可能導致數字前面的0丟失,長數字被轉成科學計數法
數字0丟失和長數字被轉換問科學計數法的解決辦法
- 開啟一個空白的excel模板
- 點選導航欄的資料
- 選擇匯入文字檔案
- 匯入csv
- 選擇csv
- 檔案型別選擇逗號分隔符,分隔符號(選擇逗號或分號)
- 列資料格式選擇(點選每列,將一些數字列選擇為文字)
- 完成匯入
- 另存為excel
//示例程式碼,引數格式['title' => ['標題'],'content' => [['我是標題']]]
function exportSpreadsheetCsv($arrData, $fileName)
{
$delimiter = ',';//經過測試
header('Content-Description: File Transfer');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename=' . $fileName . '.csv');
header('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a'); //開啟output流
$csvTitle = chr(0xEF). chr(0xBB). chr(0xBF);
foreach ($arrData['title'] as $title) {
$csvTitle .= '"'.$title.'"'.$delimiter;
}
$csvTitle = substr($csvTitle, 0, -1);
$csvTitle .= PHP_EOL;
fputs($fp, $csvTitle,strlen($csvTitle));
$dataNum = count($arrData['content']);
$perSize = 1000; //每次匯出的條數
$pages = ceil($dataNum / $perSize);
for ($i = 1; $i <= $pages; $i++) {
$step = ($i * $perSize) - 1;
$csvData = '';
foreach ($arrData['content'] as $key => $item) {
if ($key > $step || $key <= $step - $perSize) {
continue;
}
array_map(function($val)use(&$csvData,$delimiter){
//替換逗號,防止導致csv格式錯亂
$val = (string)$val;
if(!empty($val) && (strpos($val,',') !== false || strpos($val,',') !== false)){
$val = str_replace([',',','],[' ',' '],$val);
}
$csvData .= '"'.$val.'"'.$delimiter;
return $val;
},$item);
$csvData = substr($csvData, 0, -1);
$csvData .= PHP_EOL;
}
fputs($fp, $csvData,strlen($csvData));
//重新整理輸出緩衝到瀏覽器
flush(); //必須同時使用 ob_flush() 和flush() 函式來重新整理輸出緩衝。
}
fclose($fp);
unset($arrData);
exit;
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結