我使用的是thinkphp架構
遇到個一情境,發貨員發貨之後需要一個一個給使用者發通知簡訊,效率太低,所以我就想到了模板簡訊,
降到效率問題,我是這樣設計的,他把Excel匯入,我通過phpExcel進行解析,匹配到姓名,電話,和訂單號,訂單類型
然後向使用者發送通知簡訊,根據訂單類型發送不同的訂單查詢地址和通知資訊
------------------------------------------------------------------------------------------------------------------------------------------
這篇主要記錄下我使用PHPExcel的過程
這篇不是遠創,是看了好多大神的文章後整理的,甚至說複製的代碼,但是具體的原文我沒有做記錄,就不一點一點貼出來了
寫此文僅供自己記錄學習之用
----------------------------------------------------------------------------------------------------------------------------------------
1:下載PHPExcel
可以從官網下載,我也把文檔上傳了http://download.csdn.net/detail/fei003/9851672
2 把PHPExcel放入項目中
把PHPExcel解壓後的檔案放入Thinkphp/Library/Vendor中
3.把操作方法封裝成函數(或者類庫),方便自己使用
excel.PHP 函數
<?php/** * Created by PhpStorm. * User: 飛 * Date: 2017/6/13 * Time: 10:20 * 匯入excel檔案,對錶格進行解析 */function importExecl($file,$filetype){ if(!file_exists($file)){ return array("error"=>0,'message'=>'file not found!'); } // 判斷文件類型,使用相應的方法,可以解析多種檔案,這隻是判斷兩個,其餘的自己判斷 if($filetype == 'xlsx'){ $filetype = 'Excel2007'; }elseif($filetype == 'xls'){ $filetype = 'Excel5'; } // 引入擴充 Vendor("PHPExcel.PHPExcel.IOFactory"); $objReader = \PHPExcel_IOFactory::createReader($filetype); try{ $PHPReader = $objReader->load($file); }catch(Exception $e){} if(!isset($PHPReader)) return array("error"=>0,'message'=>'read error!'); // 獲得所有的sheets表格 $allWorksheets = $PHPReader->getAllSheets(); $i = 0; //對sheet表格遍曆分析 foreach($allWorksheets as $objWorksheet){ // 獲得sheet表格的標題 $sheetname=$objWorksheet->getTitle(); // 獲得總行數 $allRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); // 獲得總列數 $allColumn = \PHPExcel_Cell::columnIndexFromString($highestColumn); $array[$i]["Title"] = $sheetname; $array[$i]["Cols"] = $allColumn; $array[$i]["Rows"] = $allRow; $arr = array(); // 對合并的儲存格進行分析 $isMergeCell = array(); foreach ($objWorksheet->getMergeCells() as $cells) {//merge cells foreach (\PHPExcel_Cell::extractAllCellReferencesInRange($cells) as $cellReference) { $isMergeCell[$cellReference] = true; } } for($currentRow = 1 ;$currentRow<=$allRow;$currentRow++){ $row = array(); for($currentColumn=0;$currentColumn<$allColumn;$currentColumn++){; $cell =$objWorksheet->getCellByColumnAndRow($currentColumn, $currentRow); $afCol = \PHPExcel_Cell::stringFromColumnIndex($currentColumn+1); $bfCol = \PHPExcel_Cell::stringFromColumnIndex($currentColumn-1); $col = \PHPExcel_Cell::stringFromColumnIndex($currentColumn); $address = $col.$currentRow; $value = $objWorksheet->getCell($address)->getValue(); if(substr($value,0,1)=='='){ return array("error"=>0,'message'=>'can not use the formula!'); exit; } if($cell->getDataType()==\PHPExcel_Cell_DataType::TYPE_NUMERIC){ // $cellstyleformat=$cell->getParent()->getStyle( $cell->getCoordinate() )->getNumberFormat(); // $formatcode=$cellstyleformat->getFormatCode(); if (preg_match('/^([$[A-Z]*-[0-9A-F]*])*[hmsdy]/i', $formatcode)) { $value=gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($value)); }else{ $value=\PHPExcel_Style_NumberFormat::toFormattedString($value,$formatcode); } } if($isMergeCell[$col.$currentRow]&&$isMergeCell[$afCol.$currentRow]&&!empty($value)){ $temp = $value; }elseif($isMergeCell[$col.$currentRow]&&$isMergeCell[$col.($currentRow-1)]&&empty($value)){ $value=$arr[$currentRow-1][$currentColumn]; }elseif($isMergeCell[$col.$currentRow]&&$isMergeCell[$bfCol.$currentRow]&&empty($value)){ $value=$temp; } $row[$currentColumn] = $value; } $arr[$currentRow] = $row; } $array[$i]["Content"] = $arr; $i++; } // spl_autoload_register('Think');//must, resolve ThinkPHP and PHPExcel conflicts unset($objWorksheet); unset($PHPReader); unset($PHPExcel); unlink($file); return array("error"=>1,"data"=>$array);}
注意:執行個體化時命名空間要加\
使用的時候就簡單了,下面是使用代碼
<?phpnamespace PhpExcel\Controller;use Think\Controller;/** * Created by PhpStorm. * User: 飛 * Date: 2017/6/7 * Time: 11:26 */class IndexController extends Controller{ public function index() { $this->display(); } public function importExcel() { // 表單提交檔案過來 // 獲得檔案路徑 $file = $_FILES[excel][tmp_name]; if(!file_exists($file)){ echo '檔案不存在'; exit; } // $fileMessage = explode('.',$_FILES[excel][name]); // $filename = $fileMessage[0]; // 獲得副檔名 $filetype = $fileMessage[1]; //使用函數,獲得excel資料 $re = importExecl($file,$filetype); $content = $re['data'][0]['Content']; // P助手函數,自己擴充 P($content);exit; /*邏輯代碼*/ }}
然後在頁面中列印如下
從頁面上來看,資料解析的很不錯
當然,拿到資料後,是不是想幹什麼就幹什麼呢。。。嘿嘿
---------------------------------------------------------------------------------------------------
另外一種情境就是把自己的資料產生excel表格
代碼如下
public function outPortExcel(){ // 引入檔案 Vendor("PHPExcel.PHPExcel"); vendor('PHPExcel/PHPExcel/Writer/Excel2007.php'); $phpExcel = new \PHPExcel(); $phpExcel->getProperties()->setTitle("Office 2007 XLSX Test Document title"); $phpExcel->getProperties()->setSubject("Office 2007 XLSX Test Document subject"); //單獨添加資料 $phpExcel->setActiveSheetIndex(0); $phpExcel->getActiveSheet()->setCellValue('A1', '姓名');//可以指定位置 $phpExcel->getActiveSheet()->setCellValue('B1', '年齡'); $phpExcel->getActiveSheet()->setCellValue('C1', '性別'); $phpExcel->getActiveSheet()->setCellValue('D1', '家庭'); //迴圈添加資料(根據自己的邏輯) for($i = 2;$i<200;$i++) { $phpExcel->getActiveSheet()->setCellValue('A' . $i, '張鵬飛'.$i); $phpExcel->getActiveSheet()->setCellValue('B' . $i, rand(25,28)); $phpExcel->getActiveSheet()->setCellValue('C' . $i, rand(0,1)); $phpExcel->getActiveSheet()->setCellValue('D' . $i, 'yes'); } $objWriter = new \PHPExcel_Writer_Excel2007($phpExcel); // 檔案名稱 $filename = './a.xlsx'; // 隱藏檔 $objWriter->save($filename); // 下載檔案 // 強制下載函數 代碼請轉至 http://blog.csdn.net/fei003/article/details/54614097 download('./a.xlsx');}
ok,這就是PHPExcel的使用過程