Home >php教程 >php手册 >导出业务数据为表格(csv)文件的一个简单通用的方法

导出业务数据为表格(csv)文件的一个简单通用的方法

WBOY
WBOYOriginal
2016-06-07 11:41:261306browse

一个通用的下载导出方法
/*<br> * 通用方法<br> * 导出大数据为CSV <br> * 参数依次传入 查询对象,CSV文件列头(键是数据表中的列名,值是csv的列名),文件名.对数据二次处理的函数;<br> */<br> private function DownloadCSV( $selectObject, $head, $fileName = time(), $callBack = '' ){<br>     <br>  if ( !is_object( $selectObject ) || !is_array( $head ) ) {<br>     exit('参数错误!');<br>  }<br> <br>  set_time_limit(0);<br>  //下载头.<br>  header ('Content-Type: application/vnd.ms-excel;charset=gbk');<br>  header ('Content-Disposition: attachment;filename="'.$fileName.'.csv"');<br>  header ('Cache-Control: max-age=0');<br>     <br>  //输出流;<br>  $file = 'php://output';<br>  $fp = fopen ( $file, 'a' );<br> <br>  $changCode = function( $changArr ) {<br>      // 破Excel2003中文只支持GBK编码;<br>      foreach ( $changArr as $k => $v ) {<br>          $changArr [$k] = iconv ( 'utf-8', 'gbk', $v );<br>      }<br>      //返回一个 索引数组;<br>      return array_values( $changArr );<br>  };<br> <br>  //写入头部;<br>  fputcsv ( $fp, $changCode( $head ) );<br>     <br>  //写入数据;<br>  $pageSize = 100//每次查询一百条;<br>  $page  = 1;//起始页码;<br>  $list = array();<br> <br>  //查库;<br>  $cloneObj = clone $selectObject;//因为thinkphp内部执行完select方法后会清空对象属性,所以clone;<br>     <br>  while ( $list = $cloneObj ->limit( $pageSize*( ($page++)-1 ), $pageSize )->select()  ) {<br> <br>     $cloneObj = clone $selectObject;<br>             <br>     //对查询结果二次处理<br>     is_callable( $callBack ) && $list = call_user_func( $callBack, $list );<br> <br>     foreach ( $list as $key => $value ) {<br>             <br>          $value = array_intersect_key( $value, $head );//返回需要写入CSV的数据;<br>          $value = array_merge( $head, $value );//利用此函数返回需要的顺序;<br>          $value = $changCode( $value );<br>          fputcsv ( $fp, $value );//写入数据;<br>          flush();<br>             <br>     }<br> <br>     ob_flush();<br>                 <br>  }<br> <br>  exit();<br> }//比如有一个方法 demo 在展示数据表时 还要有导出功能.<br> <br> public function demo(){<br> <br> /*<br> <br> 一堆判断搜索,之类的代码.<br> <br> */<br> <br> $list = $table->field($x)->join($l)->where($m);<br> <br> //比如$var是表单发送过来的 开启导出的"开关" <br> if ( $var == 1 )<br> <br>     $headerArr = array('数据表字段'=>'导出时CSV的列名');<br> <br>     $callBack = function( $list ) {<br>         //对数据的二次处理;<br>         return $list;<br>     };<br> <br>     $this->DownloadCSV( $list, $headerArr, 'XXX'.date('YmdHi',time()), $callBack );<br> <br> }<br> <br> $list = $list->select();<br> <br> /* 分配到模板等等 */利用thinkphp的model做的通用下载,可以节约很多做下载导出数据功能时也要写一堆 where 搜索判断的问题.

AD:真正免费,域名+虚机+企业邮箱=0元

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn