关于csv文件格式的导出导入个人见解
先上代码:
<?phpnamespace 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格式导入导出(多数据处理)
原文地址:https://www.cnblogs.com/laijinquan/p/9751100.html