warehouseGroupModel = new \app\admin\model\app\exam\WarehouseGroup; $this->warehouseQuestionModel = new \app\admin\model\app\exam\WarehouseQuestion; $this->warehouseImportModel = new \app\admin\model\app\exam\WarehouseImport; } public function handle(){ $file = $this->request->file('file'); $groupId = input('group_id'); $type = 'excel'; if (empty($file)) { $this->error("请上传文件"); } $fileInfo = $file->getInfo(); $fileTypes = [ 'word'=>['application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/msword'], 'excel'=>['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/vnd.ms-excel'], ]; $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION)); $suffix = $suffix && preg_match("/^[a-zA-Z0-9]+$/", $suffix) ? $suffix : 'file'; if (!in_array($fileInfo['type'], $fileTypes[$type]) || in_array($suffix, ['php', 'html', 'htm', 'phar', 'phtml']) || preg_match("/^php(.*)/i", $suffix)) { $this->error("文件类型不符合要求"); } //获取文件类型 $size = $fileInfo['size']/1024/1024; if($size>10){ $this->error("文件体积过大"); } //可以处理文件了 图片临时地址 $fileTempPath = $file->getRealPath(); $reader = new Xlsx(); //加载文件 if (!$PHPExcel = $reader->load($fileTempPath)) { $this->error(__('Unknown data format')); } $count = 0; for($i = 0 ;$i < $PHPExcel->getSheetCount() ;$i++){ $sheetData = $this->getSheetData($PHPExcel,$i,$groupId); $count += count($sheetData); foreach (array_chunk($sheetData,100) as $data){ $this->warehouseQuestionModel->insertAll($data); } } $this->success("已导入{$count}条题目"); } /** * 获取工作表的数据 * @param $PHPExcel * @param $typeIndex * @param int $groupId 分组ID * @return array */ public function getSheetData($PHPExcel,$typeIndex,$groupId = 0){ $insert = []; $currentSheet = $PHPExcel->getSheet($typeIndex); //读取文件中的第一个工作表 $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { $values = []; for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $values[] = is_null($val) ? '' : $val; } $rowData = $this->warehouseImportModel->getRowData($values,$typeIndex,$groupId); if($rowData){ $rowData['uniacid'] = UNIACID; $rowData['group_id'] = $groupId; $rowData['createtime'] = time(); foreach ($rowData as $key => $val){ if($val instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText){ $rowData[$key] = $val->getPlainText(); } } $insert[] = $rowData; } } return $insert; } }