利用PHPExcel 實現excel數據的導入導出(源碼實現)


利用PHPExcel 實現excel數據的導入導出(源碼實現)

在開發過程中,經常會遇到導入導出的需求,利用phpexcel類實現起來也是比較容易的,下面,我們一步一步實現

提前將phpexcel類下載,並放在擴展目錄中,如圖所示

一、Excel導出

     導出功能,相對復雜,復雜就復雜在設置導出的excel文件的樣式以及內容如何循環賦值,而且導出之后的處理結果,一般是直接在通過瀏覽器下載到本地,或者發送郵件,在此,以下載到本地為例,下面是源碼實現

    1、首先是獲取待導出的數據,這一步比較簡單

 1 //首先獲取所有待發貨的訂單
 2 $where['status'] = 2;  3 $order_model = new OrderModel();  4 $res = $order_model
 5     ->with('OGModel')  6     ->where($where)  7     ->select()->toArray();  8 if(!$res) $this->error('暫無待發貨的記錄');  9 //dump($res);die;
10 $count = count($res);

    2、設置Excel導出文件的樣式以及為每個單元格賦值,這一步是導出最重要最復雜的一步,好在我都做了注釋

 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 $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 $filename = __ROOT__.'/upload/files/'.$excel_filename; 2 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 3 $objWriter->save($filename);

二、Excel導入

    相比導出,導入就簡單多了,廢話不多說,直接上源碼

    1、利用form表單獲取上傳的excel文件

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 //設置獲取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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM