调用方法:
$result = [];//数据源
<pre name="code" class="php">$colums = array(array("vender","name"),"city_code","score_weixinhouse","score_uv","score_topic",
"score_activity","score_weixin_send",array("status", function($status){
<span style="white-space:pre"> </span>return Model_Goods::$status[$status];
<span style="white-space:pre"> </span>}),array("id",function($id){
<span style="white-space:pre"> </span>return Arr::path(Model_AdminLog::get_bymodelid($id, "t_goods"), "0.user.screen_name");
<span style="white-space:pre"> </span>}));
$names = array("商家名称","城市","买房大号得分","流量考核得分","移动专题得分", "活动推广得分","项目服务号得分","XXX","XXX"); output_Excel($result, $colums, $names,"城市考核列表");
值得一提的是,有时候我们需要将某些字段进行简单处理,想得到处理后的结果,或者是数据源的结构不是刚好满足这样的一维数组,
甚至是二维或多维,那么这里可以用回调的方式进行处理:
比如我们注意到:
$colums = array(array("vender","name"),"city_code","score_weixinhouse","score_uv","score_topic",
"score_activity","score_weixin_send",array("status", function($status){
<span style="white-space:pre"> </span>return Model_Goods::$status[$status];
<span style="white-space:pre"> </span>}),array("id",function($id){
<span style="white-space:pre"> </span>Model_AdminLog::get_bymodelid($id)
<span style="white-space:pre"> </span>}));
这里
1.第一个参数是二维数组,表示从$result['vender']['name']里面取值。
2.倒数第二个参数,是根据$result['status']字段去获取字典,并返回结果。
3.最后一个参数,是根据$result['id']字段去调用
get_bymodelid()方法,获取返回结果
output_Excel方法,支持回调函数:
<pre name="code" class="php">function output_Excel($data,$colums,$names,$name = "未命名"){
$objPHPExcel = new PHPExcel();
$objPHPExcel->getProperties()->setCreator("das.leju.com");
$objPHPExcel->setActiveSheetIndex(0);
$char = "A";
foreach ($names as $c){
$objPHPExcel->getActiveSheet()->setCellValue($char."1", $c);
$char = chr(ord($char)+1);
}
//每一列的宽度,根据需求设置
$objPHPExcel->getActiveSheet()->getColumnDimension("A")->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension("B")->setWidth(30);
$objPHPExcel->getActiveSheet()->getColumnDimension("C")->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension("D")->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension("E")->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension("F")->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension("G")->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension("H")->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension("I")->setWidth(30);
$objPHPExcel->getActiveSheet()->getColumnDimension("J")->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension("K")->setWidth(20);
$i = 2;
foreach($data as $d){
$j = 0;
$char = "A";
foreach ($colums as $c){
if (is_array($c)){//这里如果是如下时间字段会将时间戳格式转为datetime类型
if($c[1]=="create_at"||$c[1]=="invisible"||$c[1]=="start"||$c[1]=="end"||$c[1]=="visible"){
$objPHPExcel->getActiveSheet()->setCellValue($char . $i,$d[$c[0]][$c[1]]!=""?date("Y-m-d H:i:s",$d[$c[0]][$c[1]]):$d[$c[0]][$c[1]]);
}else if(is_callable($c[1])){
$objPHPExcel->getActiveSheet()->setCellValue($char . $i,
$c[1](preg_match("/\./", $c[0])?Arr::path($d, $c[0]):$d[$c[0]])." ");
}else{
$objPHPExcel->getActiveSheet()->setCellValue($char . $i, $d[$c[0]][$c[1]]." ");
}
}else{
if($c=="create_at"||$c=="invisible"||$c=="start"||$c=="end"||$c=="visible"){
$objPHPExcel->getActiveSheet()->setCellValue($char . $i,$d[$c]!=""?date("Y-m-d H:i:s",$d[$c]):$d[$c]);
}else{
$objPHPExcel->getActiveSheet()->setCellValue($char . $i, $d[$c]." ");
}
}
$char = chr(ord($char)+1);
$j++;
}
$i++;
}
$objPHPExcel->getActiveSheet()->getStyle('A1:AE'.$i)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
// 设置页方向和规模
$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT);
$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
$objPHPExcel->setActiveSheetIndex(0);
$timestamp = time();
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($name);
ob_end_clean(); // Added by me
ob_start(); // Added by me
header('Content-Type: application/vnd.ms-excel');
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename="' . $name . '"');
} else {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '.xls"');
}
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
}
这里简单处理了下火狐和IE下文件名乱码问题,因为时间比较紧,有很多多余代码,希望自己整理。