zoukankan      html  css  js  c++  java
  • 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');

    浏览器请求,结果文件数据如下:

  • 相关阅读:
    机器任务——最小点覆盖
    树的统计
    农夫约翰
    关押罪犯
    题单
    加分二叉树(递归,区间DP)
    [动态规划] 斜率优化DP
    [树形DP] 换根DP
    [期望DP][SCOI2008] 奖励关
    [数位DP][AHOI2009] Luogu P4127 同类分布
  • 原文地址:https://www.cnblogs.com/wenzheshen/p/10521400.html
Copyright © 2011-2022 走看看