| 副标题[/!--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_dateBETWEEN '.'''.$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;
 }
 }
 最终导出的效果(单元格大小导出后调整过)可以看到和网页显示的基本一样。 
 二.大数据表格导出(编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |