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