先在网上找到一个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; }