大量数据导出excel(csv)的实现
Posted swocn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大量数据导出excel(csv)的实现相关的知识,希望对你有一定的参考价值。
<?php /** * 大量数据导出excel(csv)的实现。 * Created by PhpStorm. * User: Huming * Date: 2017-04-16 * Time: 14:04 * */ //使用MS sqlserver数据测试的 require_once \'MSSqlServerHelper.php\'; $sqlHelper = new MSSqlServerHelper(); set_time_limit(0); ini_set(\'memory_limit\', \'128M\'); date_default_timezone_set("PRC"); $fileName = date(\'YmdHis\'); //浏览器直接下载,加头文件 //header(\'Content-Type: application/vnd.ms-execl\'); //header(\'Content-Disposition: attachment;filename="\' . $fileName . \'.csv"\'); $begintime = microtime(true); //打开php标准输出流 //以写入追加的方式打开 //$fp = fopen(\'php://output\', \'ab\'); //对于大数据,使用在服务器生成文件,完成后下载 $path = $_SERVER[\'DOCUMENT_ROOT\'] . "\\\\output\\\\"; $fp = fopen("$path$fileName.csv", "a"); //我们要获取$nums条数据,每次取$step条,分步执行,避免内存溢出 //如果线上环境无法支持一次性读取$step条数据,可反$step相应减小。 $step = 10000; //指定要取的记录数 //$nums =80000; //动态获取总共的记录数 $rowscount = $sqlHelper->execute_dql_rowsCount("select count(id) from temp_sjbb"); $nums = $rowscount; //$nums = 22; //设置标题 /*$title = array(\'ID\', \'用户名\', \'用户年龄\', \'用户描述\', \'用户手机\', \'用户QQ\', \'用户邮箱\', \'用户地址\'); foreach($title as $key => $item) { $title[$key] = iconv(\'UTF-8\', \'GBK\', $item); } //标题写到标准输出中 fputcsv($fp, $title);*/ //分批获取,写入大数据,防止内存溢出 for ($s = 1; $s <= ceil($nums / $step); ++$s) { $start = (($s - 1) * $step) + 1; $end = ($s * $step) > $nums ? $nums : $s * $step; $sql = "select * from (select *,rOW_NUMBER() OVER (ORDER BY id asc) AS counts from temp_sjbb ) as b"; $sql .= " where counts >= "; $sql .= $start; $sql .= " and counts <= "; $sql .= $end; // echo $sql; $result = $sqlHelper->execute_dql_array($sql); for ($i = 0; $i < count($result); $i++) { //第一次循环把列标题打印出来 if ($s == 1 && $i == 0) { $arr = array(); foreach ($result[$i] as $key => $values) { $arr[] = $key; } fputcsv($fp, $arr); } fputcsv($fp, $result[$i]); } //刷新缓冲区 unset($result); ob_flush(); flush(); } fclose($fp); //打印下载路径 echo "<a href=\'./output/$fileName.csv\'>点击下载</a>"; $endtime = microtime(true); echo \'用时:\', $endtime - $begintime;
测试字段数为81个的8万余条数据。
以上是关于大量数据导出excel(csv)的实现的主要内容,如果未能解决你的问题,请参考以下文章