PHP 简易导出excel 类解决Excel 打开乱码
<?php class exportCsv{ //列名 protected $_column = array(); protected $_reg = array(); public $ret = ""; public function setColumn($colunms){ foreach ($colunms as $k => $colunm){ $this->_column[$k] = $colunm['title']; $this->_reg[$k]['reg'] = $colunm['reg']; $this->_reg[$k]['colunm'] = $colunm['name']; } return $this; } public function bulidData($data){ $this->ret = implode(",", $this->_column); foreach($data as $k=>$dat){ if(!empty($this->_reg)){ $dat = call_user_func_array(array($this, 'doFilter') , array($dat)); } $this->ret .= " \n".implode(",", $dat); } } public function transport($name="default"){ header("Content-Disposition: attachment; filename={$name}.csv"); header("Content-Type:APPLICATION/OCTET-STREAM"); $bomHeader = pack('H*','EFBBBF'); //将bom头转换二进制放在所有字符顶部,可以解决office Excel打开是乱码的问题 die($bomHeader.$this->ret); } private function doFilter($data){ foreach($this->_reg as $k =>$fun){ if( $data[$fun['colunm']] && method_exists($this,$fun['reg'])){ $data[$fun['colunm']] = $this->$fun['reg']($data[$fun['colunm']]); } } return $data; } //格式化时间戳 private function dataFormate($timestamp){ return date("Y-m-d",$timestamp); } //去除换行 private function htmlFormate($content){ return str_replace(array("\n","\t\n"), array(" "," "), $content); } }
使用方法:
$columnArr = array( 0=>array('title'=>'ID','name'=>'cid'), array('title'=>'用户名','name'=>'uid'), array('title'=>'评论内容','name'=>'comments','reg'=>'htmlFormate'), array('title'=>'评分', 'name'=>'satisfaction', 'reg' =>'int'), array('title'=>'商品编码', 'name'=>'goods_sn', 'reg' =>'int'), array('title'=>'添加时间','name'=>'add_time','reg'=>'dataFormate'), array('title'=>'审核状态','name'=>'status') ); import ( "@.ORG.exportCsv" ); $csvModel = new exportCsv(); $csvModel->setColumn($columnArr); set_time_limit(0); $comments = $model->table('mall_comments mc')->where($map)->field('cid,uid,comments,satisfaction,goods_sn,add_time,status')->select(); $csvModel->bulidData($comments);
生命只有一次。