1.批量导入
public function importExcel(){$authority = $this->getUserAuthority('order_input', 'batch_import');if ($authority['code'] != 0) {return json($authority);}$file = request()->file('files');if(empty($file)){return printMsg(-1, "请上传文件");}// 移动到框架应用根目录/uploads/ 目录下//$info = $file->validate(['size'=>(100*1024*1024),'ext'=>'xls,xlsx'])->move('static/uploads/');$ext_arr = ['xlsx'];//接收文件$file_type = $file->getInfo()['name'];//获取后缀$ext = explode('.', $file_type);$ext = end($ext);//判断时候是限制的文件格式if (!in_array($ext, $ext_arr)) {return printMsg(-1,'文件格式有误,只支持Excel2007,xlsx后缀的文件');}//实例化类库 // 读取excel文件require_once './../extend/PHPExcel/IOFactory.php';require_once './../extend/PHPExcel/PHPExcel.php';if ($ext == 'xls') {$PHPReader = new \PHPExcel_Reader_Excel5();} elseif ($ext == 'xlsx') {$PHPReader = new \PHPExcel_Reader_Excel2007();}$tmp_name = $file->getInfo()['tmp_name'];$objData = $PHPReader->load($tmp_name, $encode = 'utf-8');$excel_array = $objData->getsheet(0)->toArray();//删除表格第一行unset($excel_array[0]);$insertData = [];$userInfo = $this->getTokenUser();$date = date('Y-m-d H:i:s', $this->request->time());if (count($excel_array) > 500){return printMsg(-1,'批量导入行数不能大于500条');}//todo 线上对应的数据$project_name_id = 13;$source = '腾讯游戏';$project_source_detail_id = 115;$depargroup = 29;$designer_uid = 1114;Db::startTrans();try {foreach ($excel_array as $key => $value) {$line = $key+1;try {$d2 = date("Y-m-d",($value[2] - 25569) * 86400);$d3 = date("Y-m-d",($value[3] - 25569) * 86400);$d5 = date("Ym",($value[5] - 25569) * 86400);}catch (Exception $exception){Db::rollback();return printMsg(-1, "第".$line."行,日期格错误");}$line = $key+1;if (empty($value[0])){Db::rollback();return printMsg(-1, "第".$line."行,单号不能为空");}if (empty($value[1])){Db::rollback();return printMsg(-1, "第".$line."行,需求名称不能为空");}if (!$this->isDate($d2)){Db::rollback();return printMsg(-1, "第".$line."行,需求开始日期格式不正确");}if (!$this->isDate($d3)){Db::rollback();return printMsg(-1, "第".$line."行,需求结束日期格式不正确");}if (!is_numeric($value[4])){Db::rollback();return printMsg(-1, "第".$line."行,价格格式不正确");}if (!$this->isDate2($d5)){Db::rollback();return printMsg(-1, "第".$line."行,需求归属日期格式不正确");}$achievementData = ["type" => 1, #1:报价"project_name" => $project_name_id,"project_name_id" => $project_name_id,"demand_name" => $value[1],"demander" => '腾讯',"start_time" => $d2,"end_time" => $d3,"user_id" => $userInfo['id'],"create_time" => $date,"update_time" => $date,];if (!empty($value[0])) {$achievementData['sn'] = trim($value[0]);}$achiveId = $this->orderAchievement->insertGetId($achievementData);$orderInputData = [];$orderData = ['source' => $source,'project_source_detail_id' => $project_source_detail_id,'terminal' => '报价','type' => '报价','nature' => '报价','text' => '报价','nitprice' => $value[4],'workload' => 1,'status' => 1, #1:报价'create_time' => $date,'update_time' => $date,];$orderId = $this->orderModel->insertGetId($orderData);$orderInputData = ['num' => 1,'project' => $project_name_id,'order_time' => $d5,'personnel' => $userInfo['id'],'order' => $orderId,'depargroup' => $depargroup,'type' => 1, #1:报价'designer_uid' => $designer_uid,'order_achievement_id' => $achiveId,'create_time' => $date,'update_time' => $date,];$this->orderInputModel->insertGetId($orderInputData);$this->newLog('导入报价类');}Db::commit();} catch (\Exception $e) {// 回滚事务Db::rollback();throw new \Exception('导入失败');return printMsg(self::myx_code + 10, "导入失败:" . $e->getMessage());}return printMsg(0, "导入成功");}private function isDate($str) {$pattern = '/^\d{4}-\d{2}-\d{2}$/'; // 使用正则表达式匹配 YYYY-MM-DD 格式的日期if (preg_match($pattern, $str)) {return true;} else {return false;}}private function isDate2($str) {$pattern = '/^\d{4}\d{2}$/'; // 使用正则表达式匹配 YYYY-MM-DD 格式的日期if (preg_match($pattern, $str)) {return true;} else {return false;}}
excel模版文件
2.批量导出
public function download(Request $request){/*$authority = $this->getUserAuthority('order_input', 'download');if ($authority['code'] != 0) {return json($authority);}$res = controller('OrderAchievement')->index($request, true);*///return printMsg(0, "成功", $res);$order = OrderModel::where('source', '腾讯游戏')->where('status', '0')->select()->toArray();$title = [];foreach ($order as $k => $v) {if (empty($title[$v['terminal']])) {$title[$v['terminal']] = [$v['nature'] => [$v['type'] => [$v['text']]]];} else {if (empty($title[$v['terminal']][$v['nature']])) {$title[$v['terminal']][$v['nature']] = [$v['type'] => [$v['text']]];} else {if (empty($title[$v['terminal']][$v['nature']][$v['type']])) {$title[$v['terminal']][$v['nature']][$v['type']] = [$v['text']];} else {$title[$v['terminal']][$v['nature']][$v['type']][] = $v['text'];}}}}//return printMsg(0, "成功", $title);//die();$fileName = "需求订单";require_once './../extend/PHPExcel/IOFactory.php';require_once './../extend/PHPExcel/PHPExcel.php';$obj = new \PHPExcel();// 设置当前sheet$obj->setActiveSheetIndex(0);// 设置当前sheet的名称$obj->getActiveSheet()->setTitle('需求订单');// 列标$cellKey = ['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'];foreach (['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'] as $k => $v) {foreach (['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'] as $sk => $sv) {$cellKey[] = $v . $sv;}}//处理表头标题//$obj->getActiveSheet()->mergeCells('A1:' . $cellKey[(count($title) - 1) + 4] . '1');//合并单元格(如果要拆分单元格是需要先合并再拆分的,否则程序会报错)$obj->setActiveSheetIndex(0)->setCellValue('A1', '需求订单列表(仅腾讯需求)');$obj->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);$obj->getActiveSheet()->getStyle('A1')->getFont()->setSize(11);$obj->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$obj->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);$leftNumber = 4; //左边位移数量// 填充表头$obj->getActiveSheet()->setCellValue('A2', '来源')->setCellValue('B2', '单号')->setCellValue('C2', '项目名称')->setCellValue('D2', '类型');//合并单元格$obj->getActiveSheet()->mergeCells('A2:A5');$obj->getActiveSheet()->mergeCells('B2:B5');$obj->getActiveSheet()->mergeCells('C2:C5');$obj->getActiveSheet()->mergeCells('D2:D5');//居中$obj->getActiveSheet()->getStyle('A2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)->getActiveSheet()->getStyle('B2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)->getActiveSheet()->getStyle('C2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)->getActiveSheet()->getStyle('D2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$obj->getActiveSheet()->getStyle('A2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)->getActiveSheet()->getStyle('B2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)->getActiveSheet()->getStyle('C2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)->getActiveSheet()->getStyle('D2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);$i = 0;foreach ($title as $k => $v) {$obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '2', $k);$obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$i2 = $i;foreach ($title[$k] as $kj => $vj) {$i3 = $i;$obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '3', $kj);$obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '3')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);foreach ($title[$k][$kj] as $skj => $svj) {$i4 = $i;$obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '4', $skj);$obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '4')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);foreach ($svj as $ik => $iv) {$obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '5', $iv);$obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '5')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$i++;}$obj->getActiveSheet()->mergeCells(($cellKey[$i4 + $leftNumber]) . '4' . ':' . ($cellKey[$i + 3]) . '4');}$obj->getActiveSheet()->mergeCells(($cellKey[$i3 + $leftNumber]) . '3' . ':' . ($cellKey[$i + 3]) . '3');}$obj->getActiveSheet()->mergeCells(($cellKey[$i2 + $leftNumber]) . '2' . ':' . ($cellKey[$i + 3]) . '2');}$obj->getActiveSheet()->mergeCells('A1:' . $cellKey[$i + 4] . '1');/*$obj->getActiveSheet()->mergeCells('A2:A3');$obj->getActiveSheet()->mergeCells('B3:B3');$obj->getActiveSheet()->mergeCells('C3:C3');$obj->getActiveSheet()->mergeCells('D3:D3');$obj->getActiveSheet()->mergeCells('E2:G2');$obj->getActiveSheet()->mergeCells('H2:J2');$obj->getActiveSheet()->setCellValue('E3', '首页')->setCellValue('F3', '内页')->setCellValue('G3', '排版')->setCellValue('H3', '首页')->setCellValue('I3', '内页')->setCellValue('J3', '排版');*/// 导出ob_clean();header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx');header('Cache-Control: max-age=1');$objWriter = \IOFactory::createWriter($obj, 'Excel2007');$objWriter->save('php://output');}