1. 程式人生 > >利用PHPExcel 實現excel資料的匯入匯出(原始碼實現)

利用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');

二、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);