CSV 檔案的結構很簡單,逗號或分號區隔內容,並且斷行字元為新一筆資料。 依此資料格式輸出即可做出一個 CSV 檔案。

大多數如果是客戶端自行留存的檔案,個人在實作上就不考慮留檔,所以不寫入檔案,直接輸出並即時下載給客戶端使用即可!

範例如下:

設定好輸出下載的檔名,將資料從資料庫取出,定義好 CSV 標頭的欄位,接著就是迴圈存入資料,最後輸出使用「,」分隔的字串~

$filename = "BeingAGoodRDisDifficult-" . date("Y-m-d-H-i-s") . ".csv";
header('Pragma: no-cache');
header('Expires: 0');
header('Content-Disposition: attachment;filename="' . $filename . '";');
header('Content-Type: application/csv; charset=UTF-8');
$csv_arr[] = array('編號', '項目', '名稱', '時間');
$posts = $db->where('k', 0)->get('submission');
for ($i = 0; $i < count($posts); $i++) {
    $p = $posts[$i];
    $csv_arr[] = array(
        $a = str_replace(',', '、', $p['a']),
        $b = str_replace(',', '、', $p['b']),
        $c = str_replace(',', '、', $p['c']),
        $d = str_replace(',', '、', $p['d']),
    );
}
for ($j = 0; $j < count($csv_arr); $j++) {
    if ($j == 0) {
        //輸出 BOM 避免 Excel 讀取時會亂碼
        echo "xEFxBBxBF";
    }
    echo join(',', $csv_arr[$j]) . PHP_EOL;
}

最值得注意的就是第一行的開頭,如果不輸出 BOM ,那微軟 Excel 會無法知道這檔案是什麼編碼,導致亂碼產生哦!

至於如果是要給程式分析用的,就不要加上那個標頭,避免判斷出錯,這個錯發生的讓你摸不著頭緒啊,一個看不到但卻會影響判斷結果的東西最可怕惹(切身之痛)XD

移除 BOM 的方法參考如下:

if (substr($line, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) {
    $line = substr($line, 3);
}

需要請自取~

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *