php 几十万数据导出到csv

news/2024/7/3 0:53:04

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

参考资料 : https://blog.csdn.net/tim_phper/article/details/77581071 https://www.imooc.com/wenda/detail/316785


/*** 下载/导出到csv文件* @param $title  标题栏标题* @param $data : array($count = M(表名)->where($where)->count(), $data_model = M(表名)->where($where)->order($order))* @param $sqlLimit  单文件允许写入最大行* @param $mark  文件名标记信息名称* @param $func  回调函数处理查询出来的数据*/
function downloadCsv(array $title, $data, $sqlLimit = 10000, $mark = 'test', $func = '')
{set_time_limit(0);$sqlCount = $data[0];$max_line_perfile = 100000;  //单文件允许写入最大行// 输出Excel文件头,可把user.csv换成你要的文件名header('Content-Type: application/vnd.ms-excel;charset=utf-8');header('Content-Disposition: attachment;filename="' . $mark . '.csv' . '"');header('Cache-Control: max-age=0');//临时文件的删除处理$path = "./Upload/export/" . date('Ymd');//判断目录存在否,存在将删除目录下所有文件if (is_dir($path)) {rmdirr($path);} if (!is_dir($path)) {//创建目录mkdir(iconv("UTF-8", "GBK", $path), 0777, true);}//每次只从数据库取最大数目以防变量缓存太大// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小$limit = $sqlLimit;// buffer计数器$cnt = 0;$fileNameArr = array();// 逐行取出数据,不浪费内存for ($i = 0; $i < ceil($sqlCount / $sqlLimit); $i++) {$tmp_filename = $path . '/' . $mark . '_' . $i . '.csv';$fp = fopen($tmp_filename, 'w'); //生成临时文件// chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限$fileNameArr[] = $tmp_filename;// 将数据通过fputcsv写到文件句柄foreach ($title as $key => &$value) {$value = iconv("UTF-8", "GBK", $value);}fputcsv($fp, $title);$dataArr = $data[1]->limit($i * $sqlLimit, $sqlLimit)->select();foreach ($dataArr as $a) {if($func) { $func($a); }//判断是否为多维数组来决定是一次写几行if(count($a) == count($a, 1)){  //一维数组if($sqlLimit > $max_line_perfile){//限制一个文件不超过最大行exit('下载单文件数目过大,请重新设置');}$cnt++;if ($limit == $cnt) {//刷新一下输出buffer,防止由于数据过多造成问题ob_flush();flush();$cnt = 0;}fputcsv($fp, $a);} else {if(($sqlLimit * count($a))  > $max_line_perfile){//限制一个文件不超过100000行exit('下载单文件数目过大,请重新设置');}foreach ($a as $a_v) {$cnt++;if ($limit == $cnt) {//刷新一下输出buffer,防止由于数据过多造成问题ob_flush();flush();$cnt = 0;}fputcsv($fp, $a_v);}}}fclose($fp);  //每生成一个文件关闭}//进行多个文件压缩$zip = new ZipArchive();$filename = $path . '/' . $mark . ".zip";$zip->open($filename, ZipArchive::CREATE);   //打开压缩包foreach ($fileNameArr as $file) {$zip->addFile($file, basename($file));   //向压缩包中添加文件}$zip->close();  //关闭压缩包foreach ($fileNameArr as $file) {unlink($file); //删除csv临时文件}//输出压缩文件提供下载header("Cache-Control: max-age=0");header("Content-Description: File Transfer");header('Content-disposition: attachment; filename=' . date('YmdHis').'_'.basename($filename)); // 文件名header("Content-Type: application/zip"); // zip格式的header("Content-Transfer-Encoding: binary"); //header('Content-Length: ' . filesize($filename)); //@readfile($filename);//输出文件;unlink($filename); //删除压缩包临时文件
}

引用片段

$title = array("ID\t","用户名\t","币种\t","变动资金\t","剩余资金\t","日志类型\t","行为\t","日志描述\t","IP\t","产生路径\t","时间\t");$where = preg_replace('/a\./', 'c.', $where);$where = preg_replace('/b\./', 'd.', $where);$data_model = M('user_coinlog as c')->join('LEFT JOIN basanyi_user as d on c.userid = d.id')->where($where)->field('d.username,c.*')->order('c.id desc');downloadCsv($title, array($count, $data_model), 50000, 'user_trade', function(&$data){//数据处理显示$data['add_time'] = addtime($data['add_time']);//排序并排除不需要的字段$tmp_data = [];$tmp_data[0] = $data['id'];$tmp_data[1] = $data['username'];$tmp_data[2] = $data['coin_name'];$tmp_data[3] = $data['effect'];$tmp_data[4] = $data['total'];$tmp_data[5] = $data['log_type'];$tmp_data[6] = iconv("UTF-8", "GBK", $data['action']);$tmp_data[7] = iconv("UTF-8", "GBK", $data['content']);$tmp_data[8] = $data['ip'];$tmp_data[9] = $data['node'];$tmp_data[10] = $data['add_time'];$data = $tmp_data;});

 

转载于:https://my.oschina.net/u/3171768/blog/1942412


http://lihuaxi.xjx100.cn/news/236307.html

相关文章

linux字符界面教程,打造字符界面的多媒体Linux系统

打造字符界面的多媒体Linux系统打造字符界面的多媒体Linux系统0 环境与目标硬件&#xff1a;ThinkPad R52笔记本一台。目标&#xff1a;字符界面的LINUX系统&#xff0c;同时可以看图片&#xff0c;听音乐&#xff0c;看视频&#xff0c;无线上网。1 系统安装1.1 最小安装系统官…

MaxCompute studio与权限那些事儿

背景知识 MaxCompute拥有一套强大的安全体系&#xff0c;来保护项目空间里的数据安全。用户在使用MaxCompute时&#xff0c;应理解权限的一些基本概念&#xff1a; 权限可分解为三要素&#xff0c;即主体&#xff08;用户账号或角色&#xff09;&#xff0c;客体&#xff08;表…

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator

一、前言 利用FPGA设计算法一直以来都是热点&#xff0c;同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建&#xff0c;在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen&#xff08;system generator&#xff09;工具扩展了MATLAB的simul…

黑裙安装linux环境,Linux学习笔记(一) ---- 安装Linux系统

学习Linux的第一件事情&#xff0c;你得先有个Linux系统&#xff0c;才能知道怎么学吧&#xff1f;于是安装Linux是第一部,找网上找了不少教程&#xff0c;自己总结了一下&#xff0c;些一个博文先。我安装的Linux是在VMWare 7.2版本上安装的&#xff0c;安装的是Ret Hat Linux…

「小程序JAVA实战」小程序的举报功能开发(68)

转自&#xff1a;https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudeweixinapicaidancaozuo66-2/ 通过点击举报按钮&#xff0c;跳转到举报页面完成举报操作。 后台开发 获取发布人的userId&#xff0c;videoId&#xff0c;创建者的Id controllerUserControlle…

base64格式的图片数据如何转成图片

base64格式的图片数据如何转成图片 一、总结 一句话总结&#xff1a;不仅要去掉前面的格式串&#xff0c;还需要base64_decode&#xff08;&#xff09;解码才行。 1 // $base_img是获取到前端传递的值2 $base_img str_replace(data:image/jpg;base64,, , $base_img);3 // 设…

自动化运维—saltstack

2019独角兽企业重金招聘Python工程师标准>>> 自动化运维——saltstack 、ansible 一、自动化运维介绍 传统运维&#xff1a;传统运维效率低&#xff0c;大多工作需要人工完成&#xff0c;工作繁琐&#xff0c;容易出错&#xff0c;每日重复做相同的事情&#xff0c;…

java简单的ID生成器

2019独角兽企业重金招聘Python工程师标准>>> https://www.cnblogs.com/hongdada/p/9324473.html https://github.com/apache/incubator-shardingsphere 转载于:https://my.oschina.net/u/3005325/blog/3006311