码迷,mamicode.com
首页 > Web开发 > 详细

thinkphp5 csv格式导入导出(多数据处理)

时间:2018-10-07 20:27:10      阅读:447      评论:0      收藏:0      [点我收藏+]

标签:内容类型   tac   erro   编号   col   格式   oba   att   号码   

关于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();
    }

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

thinkphp5 csv格式导入导出(多数据处理)

标签:内容类型   tac   erro   编号   col   格式   oba   att   号码   

原文地址:https://www.cnblogs.com/laijinquan/p/9751100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!