安裝
composer require phpoffice/phpspreadsheet
2.建立封裝類
Excel.php
封裝方法如下:
<?php //根據自己的文件位置更改命名空間 namespace app\admin\library; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; use think\exception\ValidateException; use think\facade\Filesystem; class Excel { /** * @param string $filename * @return array|string * @throws \PhpOffice\PhpSpreadsheet\Exception * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception */ public static function importExcel($filename = "") { $file[] = $filename; try { // 驗證文件大小,名稱等是否正確 validate(['file' => 'fileSize:51200|fileExt:xls,xlsx']) ->check($file); // 將文件保存到本地 $savename = Filesystem::disk('public')->putFile('file', $file[0]); // 截取后綴 $fileExtendName = substr(strrchr($savename, '.'), 1); // 有Xls和Xlsx格式兩種 if ($fileExtendName == 'xlsx') { $objReader = IOFactory::createReader('Xlsx'); } else { $objReader = IOFactory::createReader('Xls'); } // 設置文件為只讀 $objReader->setReadDataOnly(TRUE); // 讀取文件,tp6默認上傳的文件,在runtime的相應目錄下,可根據實際情況自己更改 $objPHPExcel = $objReader->load(public_path() . 'admin/' . $savename); //excel中的第一張sheet $sheet = $objPHPExcel->getSheet(0); // 取得總行數 $highestRow = $sheet->getHighestRow(); // 取得總列數 $highestColumn = $sheet->getHighestColumn(); Coordinate::columnIndexFromString($highestColumn); $lines = $highestRow - 1; if ($lines <= 0) { return "數據為空數組"; } // 直接取出excle中的數據 $data = $objPHPExcel->getActiveSheet()->toArray(); // 刪除第一個元素(表頭) array_shift($data); //刪除文件 unlink(public_path() . 'admin/' . $savename); // 返回結果 return $data; } catch (ValidateException $e) { return $e->getMessage(); } } // 導出 public static function export($header = [], $type = true, $data = [], $fileName = "1910") { // 實例化類 $preadsheet = new Spreadsheet(); // 創建sheet $sheet = $preadsheet->getActiveSheet(); // 循環設置表頭數據 foreach ($header as $k => $v) { $sheet->setCellValue($k, $v); } // 生成數據 $sheet->fromArray($data, null, "A2"); // 樣式設置 $sheet->getDefaultColumnDimension()->setWidth(12); // 設置下載與后綴 if ($type) { header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); $type = "Xlsx"; $suffix = "xlsx"; } else { header("Content-Type:application/vnd.ms-excel"); $type = "Xls"; $suffix = "xls"; } ob_end_clean();//清楚緩存區 // 激活瀏覽器窗口 header("Content-Disposition:attachment;filename=$fileName.$suffix"); //緩存控制 header("Cache-Control:max-age=0"); // 調用方法執行下載 $writer = IOFactory::createWriter($preadsheet, $type); // 數據流 $writer->save("php://output"); } }
控制器調用:
/導入 public function index(Request $request) { // 接收文件上傳信息 $files = $request->file("myfile"); // 調用類庫,讀取excel中的內容 $data = Excel::importExcel($files); dd($data); // 二維數組 } //導出 public function get() { // 設置表格的表頭數據 $header = ["A1" => "編號", "B1" => "姓名", "C1" => "年齡"]; // 假設下面這個數組從數據庫查詢出的二維數組 $data = [ [1,'張三',18], [2,'李四',19], [3,'王五',22], [4,'趙六',19], [5,'李梅',17] ]; //也可從數據庫里查值 $data=Db::name('數據庫名')->select()->toArray(); // 保存文件的類型 $type= true; // 設置下載文件保存的名稱 $fileName = '信息導出'.time(); // 調用方法導出excel Excel::export($header,$type,$data,$fileName); }