php導出數據到多個csv並打包壓縮


1.不壓縮直接下載

// 測試php導出大量數據到csv
public function actionExportData()
{
    // 設置不超時
    set_time_limit(0);
    // 設置最大可用內存
    ini_set('memory_limit', '1024M');
    // 設置第一列名標題名稱
    $columns = ['id', 'username', 'email'];

    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="導出數據-'.date('Y-m-d', time()).'.csv"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');

    // 打開output流
    $fp = fopen('php://output', 'a');
    // 把變量從UTF-8轉成GBK編碼
    mb_convert_variables('GBK', 'UTF-8', $columns);
    // 將數據格式化為CSV格式並寫入到output流中
    fputcsv($fp, $columns);

    foreach (User::find()->select('id, username, email')->where(['status' => 10])->batch(100) as $items) {
        foreach ($items as $item) {
            $rowData = [
                'id' => $item->id,
                'username' => $item->username ?: '',
                'email' => $item->email ?: '',
            ];
            mb_convert_variables('GBK', 'UTF-8', $rowData);
            fputcsv($fp, $rowData);
        }
        // 刷新輸出緩沖區
        ob_flush();
        flush();
    }
    fclose($fp);
    exit();
}

2.導出成多個文件並打包成zip文件

public function actionZip()
{
    // 設置不超時
    set_time_limit(0);
    // 設置最大可用內存
    ini_set('memory_limit', '1024M');
    // 設置第一列名標題名稱
    $columns = ['id', 'username', 'email'];
    // 下面以分頁形式導出
    // 總記錄數
    $countUser = User::find()->where(['status' => 10])->count();
    // 總頁數
    $pages = ceil($countUser / 200);
    $fileArr = [];
    for ($i = 0; $i < $pages; $i++) {
        if ($i == 0) {
            // 打開一個臨時文件
            $filename = dirname(__DIR__) . '/components/page' . $i . '.csv';
            $fileArr[] = $filename;
            // 打開一個文件句柄
            $fp = fopen($filename, 'w');
            // 把變量從UTF-8轉成GBK編碼
            mb_convert_variables('GBK', 'UTF-8', $columns);
            fputcsv($fp, $columns);
        }
        $users = User::find()
            ->select('id, username, email')
            ->where(['status' => 10])
            ->asArray()
            ->limit(200)
            ->offset($i * 200)
            ->all();
        foreach ($users as $user) {
            mb_convert_variables('GBK', 'UTF-8', $user);
            fputcsv($fp, $user);
        }
        // 刷新輸出緩沖區
        //ob_flush();
        //flush();
        // 當已經輸出5頁的數據時再新建一個文件
        if ($i != 0 && $i % 10 == 0) {
            // 關閉當前文件
            fclose($fp);
            // 重新打開一個新文件
            // 打開一個臨時文件
            $filename = dirname(__DIR__) . '/components/page' . $i . '.csv';
            $fileArr[] = $filename;
            // 打開一個文件句柄
            $fp = fopen($filename, 'w');
            // 把變量從UTF-8轉成GBK編碼
            mb_convert_variables('GBK', 'UTF-8', $columns);
            fputcsv($fp, $columns);
        }
        if ($i == ($pages - 1)) {
            // 如果是最后一頁,執行完就關閉文件
            fclose($fp);
        }
    }
    // 壓縮打包
    $zip = new \ZipArchive();
    $zipName = dirname(__DIR__) . '/components/' . time() . '.zip';
    $zip->open($zipName, \ZipArchive::CREATE);
    foreach ($fileArr as $file) {
        $zip->addFile($file, basename($file));
    }
    $zip->close();
    foreach ($fileArr as $file) {
        unlink($file);
    }
    header('Content-disposition: attachment; filename=' . basename($zipName));
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: ' . filesize($zipName));
    readfile($zipName);
    @unlink($zipName);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM