thinkphp5 csv格式導入導出(多數據處理)


關於csv文件格式的導出導入個人見解

先上代碼:

<?php
namespace think;

class Csv
{
    /**
     * 導出csv文件
     * @param $list 數據源
     * @param $title 數據列表
     */
    public function put_csv($list,$title)
    {
        $file_name = "exam".time().".csv";//文件名
        header('Content-Type: application/vnd.ms-excel');//設置內容類型為Excel
        header('Content-Disposition: attachment;filename='.$file_name );//下載文件
        header('Cache-Control: max-age=0');//表示當訪問此網頁后的0秒內再次訪問不會去服務器
        $file = fopen('php://output',"a");//打開文件或者 URL,  php://output 是一個只寫的數據流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩沖區,  a:寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
        $limit = 1000;
        $calc = 0;
        foreach ($title as $v){
            $tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);//轉碼
        }
        fputcsv($file,$tit);//將行格式化為 CSV 並寫入一個打開的文件中。(標題)
        foreach ($list as $v){
            $calc++;
            //-------核心!!!清空緩存,將緩存上的數據寫入到文件--------
            if($limit == $calc){
                ob_flush();//將本來存在輸出緩存中的內容取出來,調用ob_flush()之后緩沖區內容將被丟棄。
                flush();   //待輸出的內容立即發送。   具體查看:https://www.jb51.net/article/37822.htm
                $calc = 0;
            }//-------核心--------
            foreach($v as $t){
                $tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);
            }
            fputcsv($file,$tarr);//將行格式化為 CSV 並寫入一個打開的文件中。(內容)
            unset($tarr);//銷毀指定的變量
        }
        unset($list);//銷毀指定的變量
        fclose($file);//關閉打開的文件
        exit();
    }

    // csv導入,此格式每次最多可以處理1000條數據(我覺得這個是不對的,他規定的是讀取一行的最大長度)
    //$filename  文件路徑
    public function input_csv($filename) {
        $csv_file = $handle = fopen($filename,'r');//只讀方式打開,將文件指針指向文件頭]
        $result_arr = array ();
        $i = 0;
        //函數從文件指針中讀入一行並解析 CSV 字段(一維數組)
        while($data_line = fgetcsv($csv_file,1000)) {
            //跳過第一行標題讀取
            if ($i == 0) {
                $GLOBALS ['csv_key_name_arr'] = $data_line;//將標題存儲起來
                $i ++;
                continue;
            }
            //讀取內容
            foreach($GLOBALS['csv_key_name_arr'] as $csv_key_num => $csv_key_name ) {
                $csv_key_name = iconv('gb2312','utf-8', $csv_key_name);//標題
                if(empty($data_line[$csv_key_num])) {
                    $result_arr[$i][$csv_key_name] = '';
                }else {
                    $value = iconv('gb2312','utf-8', $data_line[$csv_key_num]);//標題對應的內容
                    $result_arr[$i][$csv_key_name] = $value;
                }
            }
            $i++;
        }
        fclose($handle); // 關閉指針
        return $result_arr;
    }
}

控制器的使用:

    /**
     * 大數據改 導出
     */
     public function excelOut2()
    {// 不限制腳本執行時間以確保導出完成
//        set_time_limit(0);

        $data = db('receive') -> where($where) -> order('create_time desc')-> select();
         $csv_title = array('訂單編號','客戶姓名','客戶聯電','身份證號碼','收貨地址','發展渠道編碼','訂單日期','總部商城號碼','是否開戶','備注','用戶標識','開戶號碼','卡號','套餐','運單號','簽收時間','簽收狀態','異常標記','入網時間','首充時間','首充金額','發展渠道','對應區分','發展人電話','兌換碼','訂單類型','發貨人','發貨日期','異常原因','異常轉化情況','異常操作員工','異常操作時間','店鋪','登記時間');
        //csv導出
         $csv = new Csv();  //實例化后才可以調用之前類文件定義好的方法
         $csv->put_csv($data, $csv_title);
    }


    /**
     * 大數據改 導入
     */
    public function excelIn3()
    {
        if (request() -> isPost())
        {
            // 獲取表單上傳文件
            $file = request()->file('examfile');
            if(empty($file)) {
                $this->error('請選擇上傳文件');
            }
            $info = $file->move(ROOT_PATH.'public'.DS.'upload');
            //獲取文件(日期/文件),$info->getFilename();
            $filename = ROOT_PATH.'public'.DS.'upload/'.$info->getSaveName();
//            $handle = fopen($filename,'r');//只讀方式打開,將文件指針指向文件頭]
            $csv = new Csv();
            $result = $csv->input_csv($filename); // 解析csv
            $len_result = count($result);//返回數目
            if($len_result == 0){
                $this->error('此文件中沒有數據!');
            }
//            fclose($handle); // 關閉指針
            dump($result);
            return ;
        }

        return $this -> fetch();
    }

有什么不對的歡迎提出建議。


免責聲明!

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



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