生成CSV格式excel基本规则
以下为CodeIgniter中导出csv的完整示例
知识点:输出缓冲控制 http://php.net/manual/zh/book.outcontrol.php
//导出数据 public function export(){ /* * 不使用PHPExcel生成excel文件,因为太占内存 * 生成csv基本规则 * 1、列内容用逗号分隔 * 2、\r\n换行 * 3、如果当前字段内容中有回车、换行、逗号等任意内容时,字段两头要加双引号 * 4、如果当前字段内容中有双引号,但不包含回车、换行、逗号等任意内容时,直接输出不用处理;否则字段中的双引号要进行转义(两个双引号代替1个),且字段两头加又引号 * 5、超过11位的整数要写成 ="123456789012" 形式,防止因excel自动采用科学计数法而导致内容失真(如身份证) */ //获取表字段并删除无用项 $arr_table_fields = array_diff_key($this->tableinfo(), array('id'=>0, 'sn'=>0, 'updatetime'=>0, 'createtime'=>0)); //重置要查询的字段 $select_fields = implode(',', array_keys($arr_table_fields)); //清空缓冲区 if (ob_get_level() !== 0 && @ob_end_clean() === FALSE)@ob_clean(); //输出headers header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="观众数据-'. date('YmdHis') .'.csv"'); header('Expires: 0'); header('Content-Transfer-Encoding: binary'); //header('Content-Length: '.$filesize); header('Cache-Control: private, no-transform, no-store, must-revalidate'); $str = ''; //输出表头 foreach($arr_table_fields as $row){ $str .= $row['comment'].','; } $str .= "\n"; echo utf82gbk($str); //获取记录总数 $num = $this->db->count_all('my_guanzhong'); if(! $num)return; //每次获取1000条 $pagesize = 1000; //循环获取数据并输入 //如果数据记录很多而直接全部读取到内存会导致内存溢出 ob_start(); for($i=0; $idb->select($select_fields)->order_by('id DESC')->limit($pagesize, $i*$pagesize)->get('my_guanzhong'); while($row=$res->unbuffered_row()){ foreach($row as $item){ if(is_numeric($item)){ //数值型 if(preg_match("/^-?\d{1,11}$/", (string)$item)){ //不超过11位的整数 echo $item, ','; }else{ echo '="', $item, '",'; } }else{ if(strpos($item, ',') !== FALSE || strpos($item, "\r") !== FALSE || strpos($item, "\n") !== FALSE){ //逗号、回车、换行 if(strpos($item, '"') !== FALSE){ //有双引号 echo '"', str_replace('"', '""', $item), '",'; }else{ echo '"', $item, '",'; } }else{ echo $item, ','; } } } echo "\n"; } //echo format_bytes(memory_get_peak_usage()), ', ', microtime(1)-NOW_TIME, "\n"; //获取缓冲区内容并转为gbk编码 $str = utf82gbk(ob_get_contents()); //清空缓冲区 ob_clean(); //重新输出转码后的内容 echo $str; //发送至浏览器 ob_flush(); } flush(); }