先在网上找到一个PHPExcel的类库来用。
通用PHPExcel导出excel函数代码
公用函数:/**
*数据表导出excel
*
*@authorrainfer<81818832@>
*
*@paramstring$table,不含前缀表名,必须
*@paramstring$file,保存的excel文件名,默认表名为文件名
*@paramstring$fields,需要导出的字段名,默认全部,以半角逗号隔开
*@paramstring$field_titles,需要导出的字段标题,需与$field一一对应,为空则表示直接以字段名为标题,以半角逗号隔开
*@paramstting$tag,筛选条件以字符串方式传入,例:"limit:0,8;order:post_datedesc,listorderdesc;where:id>0;"
*limit:数据条数,可以指定从第几条开始,如3,8(表示共调用8条,从第3条开始)
*order:排序方式,如:post_datedesc
*where:查询条件,字符串形式,和sql语句一样
*/
functionexport2excel($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($fieldsas$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("resultfile");//种类
//第一行数据
$objPHPExcel->setActiveSheetIndex(0);
$active=$objPHPExcel->getActiveSheet();
foreach($field_titlesas$i=>$name){
$ck=num2alpha($i++).'1';
$active->setCellValue($ck,$name);
}
//填充数据
foreach($dataas$k=>$v){
$k=$k+1;
$num=$k+1;//数据从第二行开始录入
$objPHPExcel->setActiveSheetIndex(0);
foreach($fieldsas$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个函数:
/**
*生成参数列表,以数组形式返回
*@authorrainfer<81818832@>
*/
functionparam2array($tag=''){
$param=array();
$array=explode(';',$tag);
foreach($arrayas$v){
$v=trim($v);
if(!empty($v)){
list($key,$val)=explode(':',$v);
$param[trim($key)]=trim($val);
}
}
return$param;
}
/**
*数字到字母列
*@authorrainfer<81818832@>
*/
functionnum2alpha($intNum,$isLower=false){
$num26=base_convert($intNum,10,26);
$addcode=$isLower?49:17;
$result='';
for($i=0;$i
$code=ord($num26{$i});
if($code
$result.=chr($code+$addcode);
}else{
$result.=chr($code+$addcode-39);
}
}
return$result;
}