在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现
提前将phpexcel类下载,并放在扩展目录中,如图所示
一、Excel导出
导出功能,相对复杂,复杂就复杂在设置导出的excel文件的样式以及内容如何循环赋值,而且导出之后的处理结果,一般是直接在通过浏览器下载到本地,或者发送邮件,在此,以下载到本地为例,下面是源码实现
1、首先是获取待导出的数据,这一步比较简单
| 1 2 3 4 5 6 7 8 9 10 | //首先获取所有待发货的订单 $where['status'] = 2; $order_model = new OrderModel(); $res = $order_model     ->with('OGModel')     ->where($where)     ->select()->toArray(); if(!$res) $this->error('暂无待发货的记录'); //dump($res);die; $count = count($res); | 
2、设置Excel导出文件的样式以及为每个单元格赋值,这一步是导出最重要最复杂的一步,好在我都做了注释
| 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 |   1 //引入Excel类   2 $objPHPExcel = new \PHPExcel();   3 // 设置excel文档的属性   4 $objPHPExcel->getProperties()->setCreator("cyf")   5     ->setLastModifiedBy("cyf Test")   6     ->setTitle("order")   7     ->setSubject("Test1")   8     ->setDescription("Test2")   9     ->setKeywords("Test3")  10     ->setCategory("Test result file");  11 //设置excel工作表名及文件名  12 $title = '待发货订单';  13 $excel_filename = '待发货订单_'.date('Ymd_His');  14 // 操作第一个工作表  15 $objPHPExcel->setActiveSheetIndex(0);  16 //第一行设置内容  17 $objPHPExcel->getActiveSheet()->setCellValue('A1',$excel_filename);  18 //合并  19 $objPHPExcel->getActiveSheet()->mergeCells('A1:AC1');  20 //设置单元格内容加粗  21 $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);  22 //设置单元格内容水平居中  23 $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);  24 //设置excel的表头  25 $sheet_title = array('订单编号','下单时间','订单金额','订单状态','支付方式','付款时间','支付单号','配送方式',  26     '收货人','联系电话','省','市','区','地址','运费','商品名称','商品货号','商品规格','商品数量','商品单价',  27     '发货单号','卖家备注','实付金额','微信/支付宝金额','余额支付','优惠金额','买家备注','物流公司','物流单号');  28 // 设置第一行和第一行的行高  29 $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(20);  30 $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(25);  31 $letter = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',  32     'Q','R','S','T', 'U','V','W','X','Y','Z','AA','AB','AC');  33 //设置单元格  34 $objPHPExcel->getActiveSheet()->getStyle('A2:AC2')->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);  35 //首先是赋值表头  36 for ($k=0;$k<29;$k++) {  37     $objPHPExcel->getActiveSheet()->setCellValue($letter[$k].'2',$sheet_title[$k]);  38     $objPHPExcel->getActiveSheet()->getStyle($letter[$k].'2')->getFont()->setSize(10)->setBold(true);  39     //设置单元格内容水平居中  40     $objPHPExcel->getActiveSheet()->getStyle($letter[$k].'2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);  41     //设置每一列的宽度  42     $objPHPExcel->getActiveSheet()->getColumnDimension($letter[$k])->setWidth(18);  43     $objPHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(30);  44   45 }  46 //开始赋值  47 for ($i=0;$i<$count;$i++) {  48     //先确定行  49     $row = $i+3;//再确定列,最顶部占一行,表头占用一行,所以加3  50     $temp = $res[$i];  51     for ($j = 0;$j<29;$j++) {  52         //开始为每个单元格赋值  53         //初始化地址数据  54         $address_arr = [];  55         $address_arr = explode(',',$temp['address_address']);  56         //初始化商品数据  57         $product_name = $product_number = $product_attr = $product_num = $product_price = '';  58         $cl = ','.chr(10);  59         foreach ($temp['o_g_model'] as $v) {  60             $product_name .= $v['title'].$cl;  61             $product_number .= $v['attrid'].$cl;  62             $attr = [];  63             $attr = json_decode($v['attr_name'],true);  64             if ($attr) {  65                 foreach ($attr as $vv) {  66                     $product_attr .= $vv.' ';  67                 }  68                 $product_attr .= $cl;  69             }  70             $product_num .= $v['num'].$cl;  71             $product_price .= $v['user_price'].$cl;  72         }  73         switch ($j) {  74             case 0 :  75                 //订单编号  76                 $cellvalue = $temp['order_num'];  77                 break;  78             case 1 :  79                 //下单时间  80                 $cellvalue = date('Y-m-d H:i:s',$temp['addtime']);  81                 break;  82             case 2 :  83                 //订单金额  84                 $cellvalue = $temp['price_sum'];  85                 break;  86             case 3 :  87                 //订单状态  88                 $cellvalue = lang('ORDER_STATUS')[$temp['status']];  89                 break;  90             case 4 :  91                 //支付方式  92                 $cellvalue = lang('ORDER_PAY')[$temp['pay_type']];  93                 break;  94             case 5 :  95                 //付款时间  96                 $cellvalue = '';  97                 break;  98             case 6 :  99                 //支付单号 100                 $cellvalue = ''; 101                 break; 102             case 7 : 103                 //配送方式 104                 $cellvalue = lang('POST_TYPE')[$temp['post_type']]; 105                 break; 106             case 8 : 107                 //收货人姓名 108                 $cellvalue = $temp['address_name']; 109                 break; 110             case 9 : 111                 //联系电话 112                 $cellvalue = $temp['address_phone']; 113                 break; 114             case 10 : 115                 //省 116                 $cellvalue = $address_arr[0]; 117                 break; 118             case 11 : 119                 //市 120                 $cellvalue = $address_arr[1]; 121                 break; 122             case 12 : 123                 //区 124                 $cellvalue = $address_arr[2]; 125                 break; 126             case 13 : 127                 //地址 128                 $cellvalue = $address_arr[3]; 129                 break; 130             case 14 : 131                 //运费 132                 $cellvalue = $temp['p_price']; 133                 break; 134             case 15 : 135                 //商品名称 136                 $cellvalue = $product_name; 137                 break; 138             case 16 : 139                 //商品货号 140                 $cellvalue = $product_number; 141                 break; 142             case 17 : 143                 //商品规格 144                 $cellvalue = $product_attr; 145                 break; 146             case 18 : 147                 //商品数量 148                 $cellvalue = $product_num; 149                 break; 150             case 19 : 151                 //商品单价 152                 $cellvalue = $product_price; 153                 break; 154             case 20 : 155                 //发货单号 156                 $cellvalue = '已废弃'; 157                 break; 158             case 21 : 159                 //卖家备注 160                 $cellvalue = ''; 161                 break; 162             case 22 : 163                 //实付金额 164                 $cellvalue = $temp['pay_money']; 165                 break; 166             case 23 : 167                 //微信支付宝金额 168                 $cellvalue = $temp['pay_money']; 169                 break; 170             case 24 : 171                 //余额支付 172                 $cellvalue = $temp['static_money']; 173                 break; 174             case 25 : 175                 //优惠金额 176                 $cellvalue = $temp['coupon']; 177                 break; 178             case 26 : 179                 //买家备注 180                 $cellvalue = ''; 181                 break; 182             case 27 : 183                 //物流公司 184                 $cellvalue = ''; 185                 break; 186             case 28 : 187                 //物流单号 188                 $cellvalue = ''; 189                 break; 190         } 191         //赋值 192         $objPHPExcel->getActiveSheet()->setCellValue($letter[$j].$row, $cellvalue); 193         //设置字体大小 194         $objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getFont()->setSize(10); 195         //设置单元格内容水平居中 196         $objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); 197         //设置自动换行 198         if ((in_array($j,[15,16,17,18,19])) && "" != $cellvalue) { 199             $objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getAlignment()->setWrapText(true); // 自动换行 200             $objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直方向上中间居中 201         } 202     } 203     // 设置行高 204     $objPHPExcel->getActiveSheet()->getRowDimension($row)->setRowHeight(21); 205 } 206 unset($res); | 
3、设置完之后,将生成的excel文件,通过浏览器下载到本地
| 1 2 3 4 5 6 7 | 1 //赋值结束,开始输出 2 $objPHPExcel->getActiveSheet()->setTitle($title); 3 header('Content-Type: application/vnd.ms-excel'); 4 header('Content-Disposition: attachment;filename="'.$excel_filename.'.xls"'); 5 header('Cache-Control: max-age=0'); 6 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 7 $objWriter->save('php://output'); | 
4、也可以在服务器上生成excel文件,然后发送到用户邮箱
| 1 2 3 | 1 $filename = __ROOT__.'/upload/files/'.$excel_filename; 2 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 3 $objWriter->save($filename); | 
二、Excel导入
相比导出,导入就简单多了,废话不多说,直接上源码
1、利用form表单获取上传的excel文件
| 1 2 3 4 5 6 7 | 1 $file = $_FILES['file']; 2 if ($file['error'] == 4) $this->error('请选择上传excel文件'); 3 $file_types = explode ( ".", $file['name'] ); 4 $excel_type = array('xls','csv','xlsx'); 5 if (!in_array(strtolower(end($file_types)),$excel_type)){ 6     $this->error("不是Excel文件,请重新上传"); 7 } | 
2、然后,读取excel文件里面的数据,这里是边读取边处理,或者全部读取出来再处理
| 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 |  1 //设置获取excel对象  2 $objReader = \PHPExcel_IOFactory::createReader('Excel5');//配置成2003版本,因为office版本可以向下兼容  3 $objPHPExcel = $objReader->load($file['tmp_name'],$encode='utf-8');//$file 为解读的excel文件  4 //dump($objPHPExcel);die;  5 $sheet = $objPHPExcel->getSheet(0);  6 $highestRow = $sheet->getHighestRow(); // 取得总行数  7 $success_item = $fail_item = 0;  8 //发货  9 $order_model = new OrderModel(); 10 //开始读取数据 11 for($j=3;$j<=$highestRow;$j++) 12 { 13     $order_num = $objPHPExcel->getActiveSheet()->getCell('A'.$j)->getValue(); 14     $poster = $objPHPExcel->getActiveSheet()->getCell("AB".$j)->getValue();//物流公司 15     $logistics = $objPHPExcel->getActiveSheet()->getCell("AC".$j)->getValue();//物流单号 16     $comm = $objPHPExcel->getActiveSheet()->getCell("V".$j)->getValue();//卖家备注 17     //判断条件 18     if(!is_null($order_num) && $order_num){ 19         $res = $order_model->where('order_num',$order_num)->field('itemid,status')->find(); 20         if ($res && $res['status'] == 2) { 21             if ((!is_null($poster) && $poster) || (!is_null($logistics) && $logistics)) { 22                 //更改状态 23                 OrderPlanModel::addLog($res['itemid'],'确认发货',$comm); 24                 $order_model->Update([ 25                     'status'=>3, 26                     'poster'=>$poster, 27                     'logistics'=>$logistics, 28                 ],['itemid'=>$res['itemid']]); 29                 $success_item ++; 30             } else { 31                 $fail_item ++; 32             } 33         } else { 34             $fail_item ++; 35         } 36     } else { 37         $fail_item++; 38     } 39 } 40 $this->success('成功条数:'.$success_item.',失败条数:'.$fail_item); |