PHP 匯出 CSV 格式檔案

xiaoyukarl發表於2019-05-17

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 協議》,轉載必須註明作者和本文連結

相關文章