thinkphp5 整合phpexcel匯入和匯出資料
<?php namespace app\index\controller; use think\Controller; use think\Db; class Index extends Controller{ public function index(){ return $this->fetch(); } //匯入 public function inserExcel(){ import('PHPExcel.PHPExcel'); import('PHPExcel.PHPExcel.IOFactory.PHPExcel_IOFactory'); import('PHPExcel.PHPExcel.Reader.Excel5'); //獲取表單上傳檔案 $file = request()->file('excel'); $info = $file->validate(['ext' => 'xlsx,xls'])->move(ROOT_PATH . 'public' . DS . 'uploads'); if ($info) { if(empty($info)) { return error('匯入失敗!'); } $exclePath = $info->getSaveName(); //獲取檔名 //上傳檔案的地址 $filename = ROOT_PATH . 'public' . DS . 'uploads' . DS . $exclePath; //判斷版本,這裡有的網上的版本沒有進行判斷,導致會報大概這樣的錯誤: //Warning: ZipArchive::getFromName() [ziparchive.getfromname]: Invalid or unitialized ,這裡加上這個判斷就可以了 $extension = strtolower( pathinfo($filename, PATHINFO_EXTENSION) ); if($extension == 'xlsx') { $objReader =\PHPExcel_IOFactory::createReader('Excel2007'); //載入檔案內容,編碼utf-8 $objPHPExcel = $objReader->load($filename, $encode = 'utf-8'); }else if($extension == 'xls'){ $objReader =\PHPExcel_IOFactory::createReader('Excel5'); $objPHPExcel = $objReader->load($filename, $encode = 'utf-8'); }else{ return error('請上傳excel格式的檔案!'); } $excel_array=$objPHPExcel->getsheet(0)->toArray(); //轉換為陣列格式 array_shift($excel_array); //刪除第一個陣列(標題); $data = []; foreach($excel_array as $k=>$v) { //data陣列根據你表字段自行修改,這裡Excel檔案裡的欄位要跟表一致 $data[$k]['name'] = $v[0]; $data[$k]['pid'] = 1; $data[$k]['type'] = $v[2]; $data[$k]['price'] = $v[3]; $data[$k]['standard'] = $v[4]; $data[$k]['unit'] = $v[5]; $data[$k]['supplier'] = $v[6]; $data[$k]['lowstock'] = $v[7]; $data[$k]['topstock'] = $v[8]; $data[$k]['stock'] = $v[9]; $data[$k]['operator'] = $v[10]; } echo "<pre>"; print_r($data); echo "</pre>"; exit(); } else { return error('匯入失敗!'); }
} //匯出 function export(){//匯出Excel import('PHPExcel.PHPExcel');//呼叫類庫,路徑是基於vendor資料夾的 import('PHPExcel.PHPExcel.Worksheet.Drawing'); import('PHPExcel.PHPExcel.Writer.Excel2007'); $xlsName = "export"; $xlsCell = array( array('uid','賬號序列'), array('user_name','名字'), array('email','郵箱'), ); $xlsData = Db::name('member')->Field('uid,user_name,email')->select(); $this->exportExcel($xlsName,$xlsCell,$xlsData); } function exportExcel($expTitle,$expCellName,$expTableData){ //include_once EXTEND_PATH.'PHPExcel/PHPExcel.php';//方法二 $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//檔名稱 $fileName = $expTitle.date('_YmdHis');//or $xlsTitle 檔名稱可根據自己情況設定 $cellNum = count($expCellName); $dataNum = count($expTableData); $objPHPExcel = new \PHPExcel();//方法一 //$objPHPExcel = new \PHPExcel();//方法二 $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U', 'V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO', 'AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'); $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合併單元格 $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.' Export time:'.date('Y-m-d H:i:s')); for($i=0;$i<$cellNum;$i++){ $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]); } // Miscellaneous glyphs, UTF-8 for($i=0;$i<$dataNum;$i++){ for($j=0;$j<$cellNum;$j++){ $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]); } } ob_end_clean();//這一步非常關鍵,用來清除緩衝區防止匯出的excel亂碼 header('pragma:public'); header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"'); header("Content-Disposition:attachment;filename=$fileName.xls");//"xls"參考下一條備註 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');//"Excel2007"生成2007版本的xlsx,"Excel5"生成2003版本的xls $objWriter->save('php://output'); exit; } } ?>