本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


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

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

 '分類一',
        '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 "xEFxBBxBF";
    }
    //輸出符合規範的 CSV 字串以及斷行
    echo csvstr($csv_arr[$j]) . PHP_EOL;
}
//跑完這份檔案就會是下載一份完整的 CSV 檔案囉!

Gist: Link

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


Share:

作者: Chun

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

參與討論

  1. support
  2. Chun

5 則留言

  1. 您好,我用了您的程式碼來練習csv匯出是可以運作正常的,不過我想說如果我要做一個表單給使用者填寫欲要匯出的表單名字的話,它就無法運作了。比如說這樣,以下是一個純html表單,然後交由csv.php處理。

    這裡是csv.php的程式碼
    if( !empty($_POST[‘csv-name’]) ){
    // 這裡是您的代碼
    }

    用form傳值的話,我就無法匯出csv了:((,不知道我漏了甚麼東西??應該要怎麼寫呢?

    1. 先確定能不能執行到我的 code 裡的那段邏輯囉!

      1. 你的code是ok的,我從表單按下去匯出的按鈕第一次是可以強制下載csv,但是再按第二次,就無法再次強制下載檔案了,不知道你有沒有遇過至樣的問題?

        1. 還沒遇過讓使用者自己命名檔案的操作耶!XD 用瀏覽器判斷結果可能不太準,可以試試用像 cURL 這類工具來操作看反應囉

發佈留言

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


文章
Filter
Apply Filters
Mastodon