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

    有什么不对的欢迎提出建议。

  • 相关阅读:
    Spring Boot 之 RabbitMQ 消息队列中间件的三种模式
    各浏览器驱动下载地址
    idea配置jdk
    谷歌打不开应用商店临时方法
    airtest下载网址
    hive不分区增量更新
    hive建表结构
    Hive 常用命令
    Hive内部表与外部表区别
    java代码中的坑
  • 原文地址:https://www.cnblogs.com/laijinquan/p/9751100.html
Copyright © 2011-2022 走看看