先在網上找到一個PHPExcel的類庫來用。
通用PHPExcel導出excel函數代碼
公用函數:
/** * 數據表導出excel * * @author rainfer <81818832@qq.com> * * @param string $table,不含前綴表名,必須 * @param string $file,保存的excel文件名,默認表名爲文件名 * @param string $fields,需要導出的字段名,默認全部,以半角逗號隔開 * @param string $field_titles,需要導出的字段標題,需與$field一一對應,爲空則表示直接以字段名爲標題,以半角逗號隔開 * @param stting $tag,篩選條件 以字符串方式傳入,例:"limit:0,8;order:post_date desc,listorder desc;where:id>0;" * limit:數據條數,可以指定從第幾條開始,如3,8(表示共調用8條,從第3條開始) * order:排序方式,如:post_date desc * where:查詢條件,字符串形式,和sql語句一樣 */ function export2excel($table,$file='',$fields='',$field_titles='',$tag=''){ //處理傳遞的參數 if(stripos($table,C('DB_PREFIX'))==0){ //含前綴的表,去除表前綴 $table=substr($table,strlen(C('DB_PREFIX'))); } $file=empty($file)?C('DB_PREFIX').$table:$file; $fieldsall=M($table)->getDbFields(); $field_titles=empty($field_titles)?array():explode(",",$field_titles); if(empty($fields)){ $fields=$fieldsall; //成員數不一致,則取字段名爲標題 if(count($fields)!=count($field_titles)){ $field_titles=$fields; } }else{ $fields=explode(",",$fields); $rst=array(); $rsttitle=array(); $title_y_n=(count($fields)==count($field_titles))?true:false; foreach($fields as $k=>$v){ if(in_array($v,$fieldsall)){ $rst[]=$v; //一一對應則取指定標題,否則取字段名 $rsttitle[]=$title_y_n?$field_titles[$k]:$v; } } $fields=$rst; $field_titles=$rsttitle; } //處理tag標簽 $tag=param2array($tag); $limit = !empty($tag['limit']) ? $tag['limit'] : ''; $order = !empty($tag['order']) ? $tag['order'] : ''; $where=array(); if (!empty($tag['where'])) { $where['_string'] = $tag['where']; } //處理數據 $data= M($table)->field(join(",",$fields))->where($where)->order($order)->limit($limit)->select(); import("Org.Util.PHPExcel"); error_reporting(E_ALL); date_default_timezone_set('Europe/London'); $objPHPExcel = new \PHPExcel(); import("Org.Util.PHPExcel.Reader.Excel5"); /*設置excel的屬性*/ $objPHPExcel->getProperties()->setCreator("rainfer")//創建人 ->setLastModifiedBy("rainfer")//最後修改人 ->setKeywords("excel")//關鍵字 ->setCategory("result file");//種類 //第一行數據 $objPHPExcel->setActiveSheetIndex(0); $active = $objPHPExcel->getActiveSheet(); foreach($field_titles as $i=>$name){ $ck = num2alpha($i++) . '1'; $active->setCellValue($ck, $name); } //填充數據 foreach($data as $k => $v){ $k=$k+1; $num=$k+1;//數據從第二行開始錄入 $objPHPExcel->setActiveSheetIndex(0); foreach($fields as $i=>$name){ $ck = num2alpha($i++) . $num; $active->setCellValue($ck, $v[$name]); } } $objPHPExcel->getActiveSheet()->setTitle($table); $objPHPExcel->setActiveSheetIndex(0); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$file.'.xls"'); header('Cache-Control: max-age=0'); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit; }
用到的2個函數:
/** * 生成參數列表,以數組形式返回 * @author rainfer <81818832@qq.com> */ function param2array($tag = ''){ $param = array(); $array = explode(';',$tag); foreach ($array as $v){ $v=trim($v); if(!empty($v)){ list($key,$val) = explode(':',$v); $param[trim($key)] = trim($val); } } return $param; } /** * 數字到字母列 * @author rainfer <81818832@qq.com> */ function num2alpha($intNum, $isLower = false){ $num26 = base_convert($intNum, 10, 26); $addcode = $isLower ? 49 : 17; $result = ''; for ($i = 0; $i < strlen($num26); $i++) { $code = ord($num26{$i}); if ($code < 58) { $result .= chr($code + $addcode); } else { $result .= chr($code + $addcode - 39); } } return $result; }