PHP 高效導入導出Excel(csv)方法之fgetcsv()和fputcsv()函數

CSV,是Comma Separated Value(逗號分隔值)的英文縮寫,一般都是純文本文件。php

1、CSV數據導入函數fgetcsv()

fgetcsv() 函數從文件指針中讀入一行並解析 CSV 字段。數組

與 fgets() 相似,不一樣的是 fgetcsv() 解析讀入的行並找出 CSV 格式的字段,而後返回一個包含這些字段的數組。瀏覽器

fgetcsv() 出錯時返回 FALSE,包括碰到文件結束時。服務器

具體使用時封裝函數以下:app

/**
     * 導入Excel數據表格
     * @param  string  $fileName  文件名
     * @param  int     $line      讀取幾行,默認所有讀取
     * @param  int     $offset    從第幾行開始讀,默認從第一行讀取
     * @return bool|array
     */
    public function importCsv($fileName, $line=0, $offset=0){
        //set_time_limit(0);//防止超時
        //ini_set("memory_limit", "512M");//防止內存溢出

        $handle = fopen($fileName,'r');
        if(!$handle){
            return  '文件打開失敗';
        }

        $i = 0;
        $j = 0;
        $arr = [];
        while($data = fgetcsv($handle)){
            //小於偏移量則不讀取,但$i仍然須要自增
            if($i < $offset && $offset){
                $i++;
                continue;
            }
            //大於讀取行數則退出
            if($i > $line && $line){
                break;
            }

            foreach ($data as $key => $value) {
                $content = iconv("gbk","utf-8//IGNORE",$value);//轉化編碼
                $arr[$j][] = $content;
            }
            $i++;
            $j++;
        }
        return $arr;
    }

2、CSV數據導出函數fputcsv()

前言:Excel表格最高支持104W行,導出數據達到上萬的量,PHPExcel就顯得有點無力了,常常卡死或者內存溢出,若作普通的數據導出功能,建議使用fputcsv()函數,由於此函數要比PHPexcel要高效的多,二十萬數據導出大概須要2到3秒。函數

fputcsv() 函數將行格式化爲 CSV 並寫入一個打開的文件。編碼

該函數返回寫入字符串的長度。若出錯,則返回 false。spa

具體使用時封裝函數以下:指針

(注意點:excel

參數:$exportUrl分兩種狀況,根據需求選擇其一

1.$exportUrl = 'php://output' 表示表示直接輸出到瀏覽器自動下載。

2.$exportUrl = "服務器目錄地址/文件名.csv" 表示輸出到指定路徑文件下。舉例:$exportUrl = "/data/a.csv")。

/**
     * 導出Excel數據表格
     * @param  array    $dataList     要導出的數組格式的數據
     * @param  array    $headList     導出的Excel數據第一列表頭
     * @param  string   $fileName     輸出Excel表格文件名
     * @param  string   $exportUrl    直接輸出到瀏覽器or輸出到指定路徑文件下
     * @return bool|false|string
     */
    public static function toExcel($dataList,$headList,$fileName,$exportUrl){
        //set_time_limit(0);//防止超時
        //ini_set("memory_limit", "512M");//防止內存溢出
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
        header('Cache-Control: max-age=0');
        //打開PHP文件句柄,php://output 表示直接輸出到瀏覽器,$exportUrl表示輸出到指定路徑文件下
        $fp = fopen($exportUrl, 'a');

        //輸出Excel列名信息
        foreach ($headList as $key => $value) {
            //CSV的Excel支持GBK編碼,必定要轉換,不然亂碼
            $headList[$key] = iconv('utf-8', 'gbk', $value);
        }

        //將數據經過fputcsv寫到文件句柄
        fputcsv($fp, $headList);

        //計數器
        $num = 0;

        //每隔$limit行,刷新一下輸出buffer,不要太大,也不要過小
        $limit = 100000;

        //逐行取出數據,不浪費內存
        $count = count($dataList);
        for ($i = 0; $i < $count; $i++) {

            $num++;

            //刷新一下輸出buffer,防止因爲數據過多形成問題
            if ($limit == $num) {
                ob_flush();
                flush();
                $num = 0;
            }

            $row = $dataList[$i];
            foreach ($row as $key => $value) {
                $row[$key] = iconv('utf-8', 'gbk', $value);
            }
            fputcsv($fp, $row);
        }
        return $fileName;
    }
相關文章
相關標籤/搜索