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


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

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

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

與 fgets() 類似,不同的是 fgetcsv() 解析讀入的行並找出 CSV 格式的字段,然后返回一個包含這些字段的數組。

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

具體使用時封裝函數如下:

/**
     * 導入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;
    }

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

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

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

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

具體使用時封裝函數如下:

(注意點:

參數:$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;
    }

 另:導出csv數據Demo如下,可供參考:

<?php

$headList = ['id', '姓名', '年齡'];
$dataList = [[1, 'zhangsan', 10], [2, 'lisi', 20]];
toExcel($dataList, $headList, '測試文件名稱', 'php://output');

瀏覽器請求,結果文件數據如下:

 


免責聲明!

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



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