thinkphp5.1使用PHPExcel()导出数据
项目需求需要将数据查询后导出数据,本来是想用layui里面的tool直接下载下来就好了。但是数据量大了,这就行不同了,必须要用到PHPExcel。
在网上找了很多,大部分都是基于5.0的。代码粘贴在5.1里面就跑不起来。唉。。。度娘了几分钟发现,thinkphp5.1已经不在支持vendor和import了,只支持命名空间和懒加载,可是对我这样的新手来说真的是不知道怎么处理了。然后就一直测试,调试,报错,爬坑真的很难,没个大神指导真的难。
然后在某一个角落发现了一个方法,很简单,也很容易理解,所以就记录一下自己的成长。
1、首先composer下载PHPExcel(),这个方法很简单哈!
composer require phpoffice/phpexcel
下载下来,只要里面的classes就好了,这个下载的方法网上有很多,就不做具体说明。
2、放在你想放的位置,只要你自己记着就好,我看thinkphp官网说tp6的正式版本的发布日期推迟到10月24日,我们还是放在vendor里面吧。
3、我对这个命名空间和懒加载理解还是不够深刻,就是解决不了,所以就只能 用require的方法来实现引入了,这里面我走了好多坑
require dirname(dirname(dirname(__DIR__))).'/vendor/PHPExcel/PHPExcel.php';
1
就这一句代码,放在最开头,替换掉之前的import或者是vendor,然后再控制器里面调用,记得要加上反斜杠,
$objPhpExcel=new \PHPExcel();
1
好了,现在把我的例子在放出来,供大家参考
//查找出需要导出的数据
public function DatasToExcel(){
$data = input('param.');
$data['time'] = $data['time']=="" ? '' : $this->cut_time($data['time']);
$arr = $this->sele_data($data);
return $arr;
}
//需要下载的数据
public function sele_data($data){
//什么都没选择none
if($data['app_url']=='0' && $data['time']==''){
$arr['data'] = con::con('allshow')
->order('id desc')
->select();
return $arr;
//only url
}elseif ($data['app_url']!='0' && $data['time']=='') {
$arr['data'] = con::con('allshow')
->where('location',$data['app_url'])
->order('id desc')
->select();
return $arr;
//only time
}elseif ($data['app_url']=='0' && $data['time'] !='') {
$arr['data'] = con::con('allshow')
->where('time','>',$data['time']['Btime'])
->where('time','<',$data['time']['Etime'])
->order('id desc')
->select();
return $arr;
//choose all
}else{
$arr['data'] = con::con('allshow')
->where('location',$data['app_url'])
->where('time','>',$data['time']['Btime'])
->where('time','<',$data['time']['Etime'])
->order('id desc')
->select();
return $arr;
}
}
public function ExportExcel(){
$datas = $this->DatasToExcel();//将需要导出的数据转换成数组格式
// var_dump($datas);
//此处需要自己根据自己的数据进行修改
for ($i=0; $i < count($datas['data']) ; $i++) {//拼接数据,形成新的数组,用来装新导出的数据
$data[$i]['id'] = $datas['data'][$i]["id"];
$data[$i]['location'] = $datas['data'][$i]["location"];
$data[$i]['souword'] = $datas['data'][$i]["souword"];
$data[$i]['copy_content'] = $datas['data'][$i]["copy_content"];
$data[$i]['equipment'] = $datas['data'][$i]["equipment"];
$data[$i]['sourceType']=$datas['data'][$i]["sourceType"];
if($datas['data'][$i]["user_type"]=='1'){
$data[$i]['user_type'] ="点击复制";
}elseif ($datas['data'][$i]["user_type"]=='2'){
$data[$i]['user_type'] ="长按复制";
}
//$data[$i]['user_type'] = $datas['data'][$i]["user_type"];
$data[$i]['user_ip'] = $datas['data'][$i]["user_ip"];
$data[$i]['utm_medium'] = $datas['data'][$i]["utm_medium"];
$data[$i]['utm_content'] = $datas['data'][$i]["utm_content"];
$data[$i]['utm_term'] = $datas['data'][$i]["utm_term"];
$data[$i]['region'] = $datas['data'][$i]["region"];
$data[$i]['city'] = $datas['data'][$i]["city"];
$data[$i]['time'] = date("Y-m-d H:i:s",$datas['data'][$i]["time"]);
$data[$i]['times'] = date("H",$datas['data'][$i]["time"]);
}
// var_dump($data);
try {
//实例化类包 不用改
$objPhpExcel=new \PHPExcel();
//所有单元格进行垂直和水平居中设置 不用改
$objPhpExcel ->getDefaultStyle()->get[**]lignment()->setHorizontal(\PHPExcel_Style_[**]lignment::HORIZONT[**]L_CENTER);
$objPhpExcel->getDefaultStyle()->get[**]lignment()->setVertical(\PHPExcel_Style_[**]lignment::VERTIC[**]L_CENTER);
/*
设置表头标题,这里根据自己实际数据的需求写
*/
$rowVal = array(
0=>'编号',
1=>'链接',
2=>'搜索词',
3=>'复制内容',
4=>'平台',
5=>'设备',
6=>'操作类型',
7=>'访问ip',
8=>'计划',
9=>'单元',
10=>'关键字',
11=>'省',
12=>'市',
13=>'时间',
14=>'小时'
);
//设置表头的样式,你别管,这里不用你改,照抄。
foreach ($rowVal as $k=>$r){
$objPhpExcel
->get[**]ctiveSheet()
->getStyleByColumn[**]ndRow($k,1)
->getFont()->setBold(true);//字体加粗
$objPhpExcel
->get[**]ctiveSheet()
->getStyleByColumn[**]ndRow($k,1)
->get[**]lignment()
->setHorizontal(\PHPExcel_Style_[**]lignment::HORIZONT[**]L_CENTER);//文字居中
$objPhpExcel
->get[**]ctiveSheet()
->setCellValueByColumn[**]ndRow($k,1,$r);
}
//设置当前的sheet索引 用于后续内容操作 这里也不用你改,抄吧
$objPhpExcel->set[**]ctiveSheetIndex(0);
$obj[**]ctSheet=$objPhpExcel->get[**]ctiveSheet();
//设置表格的宽度 根据情况修改
$obj[**]ctSheet->getColumnDimension('[**]')->setWidth(10);//编号
$obj[**]ctSheet->getColumnDimension('B')->setWidth(30);//备注
$obj[**]ctSheet->getColumnDimension('C')->setWidth(30);//备注
$obj[**]ctSheet->getColumnDimension('D')->setWidth(30);//备注
$obj[**]ctSheet->getColumnDimension('E')->setWidth(10);//备注
$obj[**]ctSheet->getColumnDimension('F')->setWidth(20);//备注
$obj[**]ctSheet->getColumnDimension('G')->setWidth(20);//备注
$obj[**]ctSheet->getColumnDimension('H')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('I')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('J')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('K')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('L')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('M')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('N')->setWidth(50);//备注
$obj[**]ctSheet->getColumnDimension('O')->setWidth(50);//备注
/*
设置Excel表的名称 别抄 自己写
*/
$title="数据总表";//
$obj[**]ctSheet->setTitle($title);
//设置单元格内容
//var_dump($data);die;
foreach($data as $k => $v)
{
$num=$k+2;
$objPhpExcel ->set[**]ctiveSheetIndex(0)
//Excel的第[**]列,id是你查出数组的键值,下面以此类推
/*这里你别抄,我们不一样,$v['id']这些是你数据库中拿出来的数据字段 修改成自己的
//*/
->setCellValue('[**]'.$num, $v['id'])/*编号*/
->setCellValue('B'.$num, $v['location'])/*仓库名*/
->setCellValue('C'.$num, $v['souword'])/*创建时间*/
->setCellValue('D'.$num, $v['copy_content'])/*最近的修改时间*/
->setCellValue('E'.$num, $v['sourceType'])/*状态*/
->setCellValue('F'.$num, $v['equipment'])/*有无货架*/
->setCellValue('G'.$num, $v['user_type'])/*创建ip*/
->setCellValue('H'.$num, $v['user_ip'])/*创建ip*/
->setCellValue('I'.$num, $v['utm_medium'])/*创建ip*/
->setCellValue('J'.$num, $v['utm_content'])/*创建ip*/
->setCellValue('K'.$num, $v['utm_term'])/*创建ip*/
->setCellValue('L'.$num, $v['region'])/*创建ip*/
->setCellValue('M'.$num, $v['city'])
->setCellValue('N'.$num, $v['time'])
->setCellValue('O'.$num, $v['times']);
}
$name=date('Y-m-d-H-i');//设置文件名
//*抄吧*/
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Transfer-Encoding:utf-8");
header("Pragma: no-cache");
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$title.'_'.urlencode($name).'.xls"');
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPhpExcel, 'Excel5');
$objWriter->save('php://output');
// return $objWriter;
} catch (Exception $e) {
$this->error('操作异常');
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
好了,现在在前端页面调用ExportExcel()方法就能实现了数据转excel了
————————————————
版权声明:本文为CSDN博主「蹦跑的蜗牛」的原创文章,遵循CC 4.0 BY-S[**]版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43356920/article/details/102548425