加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

YII2框架中excel表格导出的要领详解

发布时间:2021-01-26 10:19:34 所属栏目:编程 来源:网络整理
导读:媒介 表格的导入导出是我们在一般开拓中常常会碰着的一个成果,正巧在最近的项目中做到了关于表格输出的成果,而且之前用TP的时辰也做过,以是想着趁着这次成果较量多样的机遇清算一下,利便往后必要的时辰,可能有必要的伴侣们参考进修,下面话不多说了,来

这时老板说了,我们不能只看总和的数据,最好是把具体数据也给导出来。既然老板发话了,那就做吧。照旧凭证第一种的要领去做,功效提醒我php瓦解了,再试一次发明提醒写入字节超出。打开php的设置文件php.ini

发明默认内存已经给到128M,应该是足够的了。于是我打开数据库一看,嚯!

靠近83万条的数据举办查询并导出,可不是会出题目嘛!怎么办呢,于是我Google了一下,发明对付大数据(2万条以上)的导出,最好是以.csv的情势。不说空话,直接上代码

1.controller文件

public function actionInventory(){
ini_set("memory_limit","2048M");
set_time_limit(0);
$id = Yii::$app->user->identity->getId();
$user = Employee::find()->where(['id'=>$id])->one();
$params = Yii::$app->request->get();

//相同的,跳转到recharge这个model文件里的inventory要领行止理赏罚数据
$data = Recharge::inventory($params);

//配置导出的文件名
$fileName = iconv('utf-8','gbk','署理商统计清单'.date("Y-m-d"));

//配置表头
$headlist = array('署理商','文章ID','文章问题','媒体','统计时刻范畴','状态','建设时刻','考核时刻','发稿时刻','退稿时刻','财政状态','本钱','贩卖额','是否是预收款媒体范例','订单种别');
header('Content-Type: application/vnd.ms-excel');

//指明导出的名目
header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
header('Cache-Control: max-age=0');

//打开PHP文件句柄,php://output 暗示直接输出到赏识器
$fp = fopen('php://output','a');

//输出Excel列名信息
foreach ($headlist as $key => $value) {
//CSV的Excel支持GBK编码,必然要转换,不然乱码
$headlist[$key] = iconv('utf-8',$value);
}

//将数据通过fputcsv写到文件句柄
fputcsv($fp,$headlist);

//每隔$limit行,革新一下输出buffer,不要太大,也不要太小
$limit = 100000;

//逐行取出数据,不挥霍内存
foreach ($data as $k => $v) {
//革新一下输出buffer,防备因为数据过多造成题目
if ($k % $limit == 0 && $k!=0) {
ob_flush();
flush();
}
$row = $data[$k];
foreach ($row as $key => $value) {
$row[$key] = iconv('utf-8',$value);
}
fputcsv($fp,$row);
}
}

2.model文件(由于这部门我要处理赏罚的过多,以是只选择了部门代码),在查询数据那部门,由于要查的数据较多,以是可以团结我之前写的关于Mysql大数据查询处理赏罚的文章看一下

//清单导出

asArray()->all(); $where2 = ''; $where2 .= ' AND (`issue_date` BETWEEN '.'''.$date_min.'''.' AND '.'''.$date_max.'')'; $where2 .= ' AND (`back_date` > ''.$date_max.'')'; $map2 = 'select company.name,media.is_advance from article LEFT JOIN custom_package ON custom_package.id = article.custom_package_id LEFT JOIN `order` ON custom_package.order_id = `order`.`id` LEFT JOIN company ON company.id = article.company_id LEFT JOIN media ON media.id = article.media_id where article.status=3 and `order`.package=0 '.$where2; //查找的第二部门数据 $list2 = Article::findBySql($map2)->asArray()->all(); $where3 = ''; $where3 .= ' AND (`issue_date` BETWEEN '.'''.$date_min.'''.' AND '.'''.$date_max.'')'; $map3 = 'select company.name,media.is_advance from article LEFT JOIN custom_package ON custom_package.id = article.custom_package_id LEFT JOIN `order` ON custom_package.order_id = `order`.`id` LEFT JOIN company ON company.id = article.company_id LEFT JOIN media ON media.id = article.media_id where article.status=5 '.$where3; //查找的第三部门数据 $list3 = Article::findBySql($map3)->asArray()->all(); $list4 = ArrayHelper::merge($list1,$list2); $list = ArrayHelper::merge($list4,$list3); } //把功效凭证表现次序存到返回的数组中 if(!empty($list)){ foreach ($list as $key => $value){ //署理公司 $inventory[$key]['company_name'] = $value['name']; //文章ID $inventory[$key]['id'] = $value['id']; //文章问题 $inventory[$key]['title'] = $value['title']; //媒体 $inventory[$key]['media'] = $value['media_name']; //统计时刻 $inventory[$key]['time'] = $time; //状态 switch($value['status']){ case 2: $inventory[$key]['status'] = '已宣布'; break; case 3: $inventory[$key]['status'] = '已退稿'; break; case 5: $inventory[$key]['status'] = '非常稿件'; break; } //建设时刻 $inventory[$key]['created'] = $value['created']; //考核时刻 $inventory[$key]['audit'] = $value['audit_at']; //发稿时刻 $inventory[$key]['issue_date'] = $value['issue_date']; //退稿时刻 $inventory[$key]['back_date'] = $value['back_date']; //财政状态 switch($value['finance_status']){ case 0: $inventory[$key]['finance_status'] = '未到结算期'; break; case 1: $inventory[$key]['finance_status'] = '可结算'; break; case 2: $inventory[$key]['finance_status'] = '资源审批中'; break; case 3: $inventory[$key]['finance_status'] = '财政审批中'; break; case 4: $inventory[$key]['finance_status'] = '已结款'; break; case 5: $inventory[$key]['finance_status'] = '未通过'; break; case 6: $inventory[$key]['finance_status'] = '财政已审批'; break; } //本钱 $inventory[$key]['cost'] = $value['cost']; //贩卖额 $inventory[$key]['company_cost'] = $value['company_cost']; //是否是预售 switch($value['is_advance']){ case 0: $inventory[$key]['is_advance'] = '否'; break; case 1: $inventory[$key]['is_advance'] = '是'; break; case 2: $inventory[$key]['is_advance'] = '条约'; break; } //订单种别 switch($params['state']){ case 1: $inventory[$key]['order_type'] = '时刻区间无退稿完成订单'; break; case 2: $inventory[$key]['order_type'] = '时刻区间宣布前退稿订单'; break; case 3: $inventory[$key]['order_type'] = '时刻区间宣布后时刻区间退稿订单'; break; case 4: $inventory[$key]['order_type'] = '时刻区间之前宣布时刻区间内退稿订单'; break; case 5: $inventory[$key]['order_type'] = '非常订单'; break; } } }else{ $inventory[0]['company_name'] = '无数据导出'; } return $inventory; }

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读