网站导航
> 资讯中心 > 学习园地 > thinkphp5.1使用PHPExcel()导出数据
thinkphp5.1使用PHPExcel()导出数据
2021-04-11

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