下載 phpspreadsheet
composer require phpoffice/phpspreadsheet
EXCEL導入導出封裝類
<?php /** * Created by PhpStorm. * User: HOUDJ * Date: 2020/7/8 * Time: 10:04 */ namespace app\common\bussiness; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\IOFactory; class Excel { /** * Excel導出 * * @param array $datas 導出數據,格式['A1' => 'XXXX公司報表', 'B1' => '序號'] * @param string $fileName 導出文件名稱 * @param string $format 導出文件類型 * @param array $options 操作選項,例如: * bool print 設置打印格式 * string freezePane 鎖定行數,例如表頭為第一行,則鎖定表頭輸入A2 * array setARGB 設置背景色,例如['A1', 'C1'] * array setWidth 設置寬度,例如['A' => 30, 'C' => 20] * bool setBorder 設置單元格邊框 * array mergeCells 設置合並單元格,例如['A1:J1' => 'A1:J1'] * array formula 設置公式,例如['F2' => '=IF(D2>0,E42/D2,0)'] * array format 設置格式,整列設置,例如['A' => 'General'] * array alignCenter 設置居中樣式,例如['A1', 'A2'] * array bold 設置加粗樣式,例如['A1', 'A2'] * string savePath 保存路徑,設置后則文件保存到服務器,不通過瀏覽器下載 * @param array $options = [ * [ * 'column' =>'字段名', * 'name' => '列名', * 'width' => '列寬度', * 'height' => '行高', * 'color' => '顏色', * 'size' => '字體大小', * 'font' => '字體', * 'image' => '是否是圖片', * 'border' => '邊框', * 'dataType' => 'n數字 ', * ] * * ] * @return bool * user: stars<1014916675@qq.com> */ function exportSheelExcel($datas, $options = [], $fileName = '', $format = 'Xlsx',$type=0) { set_time_limit(0); //初始化 $spreadsheet = new Spreadsheet(); // $fileName = iconv('utf-8', 'gb2312', $fileName);//文件名稱 //設置標題 $spreadsheet->getActiveSheet()->setTitle($fileName); $filename = $fileName.'_'.date('YmdHis'); $cellNum = count($options); /* 設置默認文字居中 */ $styleArray = [ 'alignment' => [ 'horizontal' => 'left', 'vertical' => 'left', ], ]; $spreadsheet->getDefaultStyle()->applyFromArray($styleArray); /* 設置Excel Sheet */ $spreadsheet->setActiveSheetIndex(0); $cellName = [ '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' ]; $spreadsheet->setActiveSheetIndex(0)->setCellValue('A1', $fileName); //設置行高 $spreadsheet->getActiveSheet()->getRowDimension(1)->setRowHeight(30); $spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->setBold(true)->setName('Arial')->setSize(20);; //設置行高 $spreadsheet->getActiveSheet()->getRowDimension('A1')->setRowHeight(30); //合並單元格 $spreadsheet->getActiveSheet()->mergeCells('A1:'.$cellName[$cellNum - 1].'1'); //默認水平居中 $styleArray = [ 'alignment' => [ 'horizontal' => 'center', 'vertical' => 'center', ], ]; $spreadsheet->getActiveSheet()->getStyle('A1')->applyFromArray($styleArray); $color = [ 'Black' => 'FF000000', 'White' => 'FFFFFFFF', 'Red' => 'FFFF0000', 'Red1' => 'FF800000',//COLOR_DARKRED 'Green' => 'FF00FF00', 'Green1' => 'FF008000',//COLOR_DARKGREEN 'Blue' => 'FF0000FF', 'Blue1' => 'FF000080',//COLOR_DARKBLUE 'Yellow' => 'FFFFFF00', 'Yellow1' => 'FF808000',//COLOR_DARKYELLOW ]; //設置excel第2行數據 foreach ($options as $key => $val) { $column = $cellName[$key].'2'; //設置表頭 $spreadsheet->setActiveSheetIndex(0) ->setCellValue($column, $val['name']); //設置列寬 if (isset($val['width']) && ! empty($val['width'])) { $spreadsheet->getActiveSheet()->getColumnDimension($cellName[$key])->setWidth($val['width']); } else { $spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(15);//設置默認列寬為 } //設置字體 粗體 $spreadsheet->getActiveSheet()->getStyle($column)->getFont()->setBold(true); //設置行高 if ( ! empty($val['height'])) { $spreadsheet->getActiveSheet()->getRowDimension($column)->setRowHeight($val['height']); //設置默認行高 $spreadsheet->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15); } //設置顏色 if ( ! empty($val['color']) && isset($color[$val['color']])) { $spreadsheet->getActiveSheet()->getStyle($column)->getFont()->getColor()->setARGB($color[$val['color']]); } else { $spreadsheet->getActiveSheet()->getStyle($column)->getFont()->getColor()->setARGB('FF000000'); } } $yieldData = $this->yieldData($datas); $i = 0; foreach ($yieldData as $val) { for ($j = 0; $j < $cellNum; $j++) { //$spreadsheet->setActiveSheetIndex(0)->setCellValue($cellName[$j].($i+3),' '.$val[$options[$j]['column']].' '); //數據類型 $dataType = isset($options[$j]['dataType']) ? $options[$j]['dataType'] : 's'; switch ($dataType) { case 'n'://數字 $spreadsheet->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$j].($i + 3), $val[$options[$j]['column']], $dataType); break; case 'str2num': $spreadsheet->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$j].($i + 3), $val[$options[$j]['column']], $dataType); break; case 'str': $spreadsheet->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$j].($i + 3), $val[$options[$j]['column']], $dataType); break; case 's': case 'inlineStr': $spreadsheet->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$j].($i + 3), $val[$options[$j]['column']], $dataType); break; case 'null': $spreadsheet->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$j].($i + 3), $val[$options[$j]['column']], $dataType); break; case 'f': default: $spreadsheet->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$j].($i + 3), $val[$options[$j]['column']], $dataType); break; } } $i++; } header('pragma:public'); if ($format == 'Xlsx') { header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); } elseif ($format == 'Xls') { header('Content-Type: application/vnd.ms-excel'); }
// type等於1直接下載 if($type) { $objWriter = new Xlsx($spreadsheet); $objWriter->setPreCalculateFormulas(false); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment;filename=" . $filename . '.' . strtolower($format)); header('Cache-Control: max-age=0');//禁止緩存 header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header("Content-Transfer-Encoding:binary"); header("Expires: 0"); ob_clean(); ob_start(); $objWriter->save('php://output'); /* 釋放內存 */ $spreadsheet->disconnectWorksheets(); unset($spreadsheet); ob_end_flush(); return true; }else{ $objWriter = IOFactory::createWriter($spreadsheet, $format); $rootPath=app()->getRootPath(); $savePath='/uploads'.'/exportExcel/'.$filename . '.' . strtolower($format); $a=$rootPath. 'public'.$savePath; $objWriter->save($a); /* 釋放內存 */ $spreadsheet->disconnectWorksheets(); unset($spreadsheet); ob_end_flush(); return $savePath; } } function yieldData($data){ foreach ($data as $val){ yield $val; } } //導入 public function importExcel(){ set_time_limit(0); //文件上傳導入 // $fileController=new FileController(); $res=self::uploadFileImport(); if($res['code']) { $data = $res['data']; //修正路徑 $filename = 'uploads/' . str_replace('\\', '/', $data); //進行讀取 $spreadsheet = IOFactory::load($filename); $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); array_shift($sheetData); //刪除標題; array_shift($sheetData); //刪除標題; return $sheetData; }else{ return ''; } } //文件上傳,導入文件專用,數據不入庫 public function uploadFileImport(){ // 獲取表單上傳文件 $file = \request()->file('file'); $return = array('status' => 1, 'info' => '上傳成功', 'data' => []); // 移動到框架應用根目錄/public/uploads/ 目錄下 if($file){ $savename = \think\facade\Filesystem::disk('public')->putFile( 'importExcel', $file); return self::setResAr(1,'上傳成功',$savename); } return self::setResAr(0,'上傳失敗'); } public function setResAr($code=0,$msg='',$data=array()){ return ['code'=>$code,'msg'=>$msg,'data'=>$data]; } }
導入:
/** * Notes:導入 * User: HOUDJ * Date: 2020/7/8 */ public function import(){ $excel = new Excel(); $data=$excel->importExcel();//這里已經獲取到了上傳文件中的數據行 if(count($data)){ $course=new CourseMode(); $flag=$course->importCourse($data); return returnMsg($flag['code'],$flag['data'],$flag['msg']); }else{ return returnMsg(0,'','導入數據為空'); } }
導出:
/** * Notes:導出 * User: HOUDJ * Date: 2020/7/8 */ public function export(){ $ids=input('param.ids'); $data=array(); $map=[]; if(!empty($ids)){ $idsArr=explode(',',$ids); $map[]=array('c.id','in',$idsArr); } $course=new CourseMode(); $lists =$course->getCourseLists($map, 1, 100000); //總數據 if($lists['total']){ foreach ($lists['data'] as $k=>$v){ $data[$k]['id']=$v['id']; $data[$k]['course_name']=$v['course_name']; $data[$k]['learn_style']=config('app.learn_style.'.$v['learn_style']); $data[$k]['duration']=$v['duration']; $data[$k]['teacher']=$v['teacher']; $data[$k]['cid']=\app\admin\model\Category::where('id','=',$v['cid'])->value('name');; $data[$k]['knowledge']=is_array($v['knowledge'])?implode(',',$v['knowledge']):$v['knowledge']; $data[$k]['syllabus']=$v['syllabus']; } $filename = "雲學院課程列表".date('YmdHis'); $header = array( array('column' => 'id', 'name' => '課程id', 'width' => 15), array('column' => 'course_name', 'name' => '課程名稱', 'width' => 15), array('column' => 'learn_style', 'name' => '學習方式', 'width' => 30), array('column' => 'duration', 'name' => '課程時長', 'width' => 15), array('column' => 'teacher', 'name' => '授課老師', 'width' => 35), array('column' => 'cid', 'name' => '所屬分類', 'width' => 15), array('column' => 'knowledge', 'name' => '所屬知識體系', 'width' => 15), array('column' => 'syllabus', 'name' => '課程大綱', 'width' => 15), ); $excel=new Excel(); $download_url=$excel->exportSheelExcel($data,$header,$filename);//獲取下載鏈接 if($download_url){ return returnMsg(1,config('app.web_url').$download_url,'導出成功'); }else{ return returnMsg(0,'','導出失敗'); } } }