[PHP] 寫出一個匯出 CSV 檔案的起手式

這篇,就是一個「如果你要寫一個匯出 CSV 檔案下載」程式的人可以照這框架走的範本。廢話不多說,都寫在程式碼裡的註解了!

要注意的是,下面的程式碼非完整可以直接照套的,還有需要自行客製化的部分!需要點程式技巧來使用。

<?php
//設定系統環境,確保輸出執行環境無礙
set_time_limit(0);
ini_set('memory_limit', '256M');

//判斷執行權限

//建立資料庫連線,開始取得資料

//撰寫資料庫欄位與可讀性資料的轉換方法
function mapping_submission_category($id="") {
    //常見的就是把變數換成換成可閱讀可理解的字串
    $arr = array(
        '0' => '分類一',
        '1' => '分類二',
    );
    if ($id != ""){
        return $arr[$id];
    } else {
        return $arr;
    }
}

function mapping_submission_user_age($id="") {
    //或是某些根據專案特殊轉譯過的變數替換
}


//開始準備一組匯出陣列
$csv_arr = array();

//先放置 CSV 檔案的標頭資料
$csv_arr[] = array('得票數', '系統編號', '報名人', '身分證字號', '信箱', '聯絡電話', '聯絡手機', '聯絡地址', '性別', '年齡', '作品名稱', '作品分類', '拍攝日期', '拍攝地點', '拍攝相機', '拍攝鏡頭', '相片原始檔案', '投稿日期', '審查狀態');
//設定檔案輸出名稱
$filename = "contest-data-export-" . date("Y-m-d-H-i-s") . ".csv";
//設定瀏覽器讀取此份資料為不快取,與解讀行為是下載 CSV 檔案
header('Pragma: no-cache');
header('Expires: 0');
header('Content-Disposition: attachment;filename="' . $filename . '";');
header('Content-Type: application/csv; charset=UTF-8');

for ($i = 0; $i < count($photo_data); $i++) {
    $p = $photo_data[$i];
    $csv_arr[] = array(
        //開始根據資料變數組裝後面的陣列資料
    );
}
//確保輸出內容符合 CSV 格式,定義下列方法來處理
function csvstr(array $fields): string{
    $f = fopen('php://memory', 'r+');
    if (fputcsv($f, $fields) === false) {
        return false;
    }
    rewind($f);
    $csv_line = stream_get_contents($f);
    return rtrim($csv_line);
}
//正式循環輸出陣列內容
for ($j = 0; $j < count($csv_arr); $j++) {
    if ($j == 0) {
        //檔案標頭如果沒補上 UTF-8 BOM 資訊的話,Excel 會解讀錯誤,偏向輸出給程式觀看的檔案
        echo "\xEF\xBB\xBF";
    }
    //輸出符合規範的 CSV 字串以及斷行
    echo csvstr($csv_arr[$j]) . PHP_EOL;
}
//跑完這份檔案就會是下載一份完整的 CSV 檔案囉!

Gist: Link

今天要來寫這功能,突然忘記在哪寫過,乾脆來筆記一下,未來直接改來用~

Facebook 外掛整合


Share: