副标题[/!--empirenews.page--]
                        前言
表格的导入导出是我们在日常开发中经常会遇到的一个功能,正巧在最近的项目中做到了关于表格输出的功能,并且之前用TP的时候也做过,所以想着趁着这次功能比较多样的机会整理一下,方便以后需要的时候,或者有需要的朋友们参考学习,下面话不多说了,来一起看看详细的介绍: 
本文是基于YII2框架进行开发的,不同框架可能会需要更改 
一.普通excel格式表格输出
先是最普通的导出.xls格式的表格。首先先看一下表格在网站的显示效果 
  
这里可以看到整个表格一共是7列。下面来看代码的实现。 
1.controller文件
public function actionStatistics(){ 
//设置内存 
ini_set("memory_limit","2048M"); 
set_time_limit(0);
//获取用户ID 
$id = Yii::$app->user->identity->getId(); 
//去用户表获取用户信息 
$user = Employee::find()->where(['id'=>$id])->one(); 
//获取传过来的信息(时间,公司ID之类的,根据需要查询资料生成表格) 
$params = Yii::$app->request->get(); 
$objectPHPExcel = new PHPExcel(); 
//设置表格头的输出 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('A1','代理公司'); 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('B1','收入'); 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('C1','成本'); 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('D1','稿件数'); 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('E1','毛利(收入-成本)'); 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('F1','毛利率(毛利/收入)*100%'); 
$objectPHPExcel->setActiveSheetIndex()->setCellValue('G1','ARPU值'); 
//跳转到recharge这个model文件的statistics方法去处理数据 
$data = Recharge::statistics($params); 
//指定开始输出数据的行数 
$n = 2; 
foreach ($data as $v){ 
$objectPHPExcel->getActiveSheet()->setCellValue('A'.($n),$v['company_name']); 
$objectPHPExcel->getActiveSheet()->setCellValue('B'.($n),$v['company_cost']); 
$objectPHPExcel->getActiveSheet()->setCellValue('C'.($n),$v['cost']); 
$objectPHPExcel->getActiveSheet()->setCellValue('D'.($n),$v['num']); 
$objectPHPExcel->getActiveSheet()->setCellValue('E'.($n),$v['gross_margin']); 
$objectPHPExcel->getActiveSheet()->setCellValue('F'.($n),$v['gross_profit_rate']); 
$objectPHPExcel->getActiveSheet()->setCellValue('G'.($n),$v['arpu']); 
$n = $n +1; 
} 
ob_end_clean(); 
ob_start(); 
header('Content-Type : application/vnd.ms-excel'); 
//设置输出文件名及格式 
header('Content-Disposition:attachment;filename="代理公司统计'.date("YmdHis").'.xls"'); 
//导出.xls格式的话使用Excel5,若是想导出.xlsx需要使用Excel2007 
$objWriter= PHPExcel_IOFactory::createWriter($objectPHPExcel,'Excel5'); 
$objWriter->save('php://output'); 
ob_end_flush(); 
//清空数据缓存 
unset($data); 
} 
2.model文件
//统计导出 
public static function statistics($params){
//导出时间条件 
if(empty($params['min'])){ 
$date_max = date("Y-m-d",strtotime("-1 day")); 
$date_min = date("Y-m-d",strtotime("-31 day")); 
}else{ 
$date_min = $params['min']; 
$date_max = $params['max']; 
} 
$where = ''; 
$where .= '(issue_date BETWEEN '.'''.$date_min.'''.' AND '.'''.$date_max.'')'; 
//查找指定数据 
$sql = 'select 
article.company_id,article.cost,article.company_cost 
from article WHERE article.status=2 AND '.$where; 
$article = Article::findBySql($sql)->asArray()->all(); 
$article = ArrayHelper::index($article,null,'company_id'); 
$companys = []; 
foreach ($article as $key=>$v){ 
if(empty($key)){ 
continue; 
}else{ 
$number = count($v); 
$company = Company::find()->where(['id'=>$key])->select('name')->one(); 
$company_name = $company['name']; 
$cost = 0; 
$company_cost = 0; 
foreach ($v as $n){ 
$cost += $n['cost']; 
$company_cost += $n['company_cost']; 
} 
if($company_cost == 0){ 
$company_cost =1; 
} 
//这里注意,数据的存储顺序要和输出的表格里的顺序一样 
$companys[] = [ 
//公司名 
'company_name' => $company_name,//收入 
'company_cost' => $company_cost,//成本 
'cost' => $cost,//稿件数 
'num' => $number,//毛利 
'gross_margin' => $company_cost-$cost,//毛利率 
'gross_profit_rate' => round(($company_cost-$cost)/$company_cost*100,2).'%',//ARPU值 
'arpu' => round($company_cost/$number,2),]; 
} 
} 
return $companys; 
} 
} 
最终导出的效果(单元格大小导出后调整过)可以看到和网页显示的基本一样。 
  
二.大数据表格导出
                                                (编辑:52站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |