🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 上传excel,并且将其数据插入数据库 > php上传excel需要用到PHPExcel > > 需要composer安装:composer require phpoffice/phpexcel(该方法最好实时从网上寻找,此不一定管用,以实际为准) > composer安装完成在方法中使用 ```php use PHPExcel_IOFactory; use PHPExcel; ``` > tp中使用 > ```php // excel上传 public function excel_upload(){ Db::startTrans(); try { $file = $_FILES['file']; //需要用这种方法接收 $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); //pathinfo()函数以数组的形式返回文件路径的信息 if ($extension == "xlsx") { //2007(相当于是打开接收的这个excel) $objReader = \PHPExcel_IOFactory::createReader('Excel2007'); } else { //2003(相当于是打开接收的这个excel) exit(json_encode(['status' => 0, 'msg' => '不是期望的文件'])); } // 这是另外一种,把表数据分为ABCD等来区分 //载入文件 $PHPExcel = $objReader->load($file['tmp_name']); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $currentSheet = $PHPExcel->getSheet(0); //获取总列数 $allColumn = $currentSheet->getHighestColumn(); //获取总行数 $allRow = $currentSheet->getHighestRow(); //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始 for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) { //从哪列开始,A表示第一列 for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) { //数据坐标 $address = $currentColumn . $currentRow; //读取到的数据,保存到数组$data中 $cell = $currentSheet->getCell($address)->getValue(); $data[$currentRow - 1][$currentColumn] = $cell; } } // 这是第一种,就是简单的 $objContent = $objReader->load($file['tmp_name']); //加载缓存文件 $sheetContent = $objContent->getSheet(0) //获取活动的表格 ->toArray(); // 转换成数组 $excel_array = $sheetContent[0]; array_shift($sheetContent); $data = []; // 表格数据转为数组,而且该数组格式固定 foreach ($sheetContent as $k => $v){ $data[$k]['supplier_name'] = $v[0]; $data[$k]['goods_code'] = $v[1]; $data[$k]['goods_name'] = $v[2]; $data[$k]['color'] = $v[3]; $data[$k]['color_code'] = $v[4]; $data[$k]['size_code'] = $v[5]; $data[$k]['size_name'] = $v[6]; $data[$k]['barcode'] = $v[7]; $data[$k]['inventory'] = $v[8]; // 这是判断店铺 if (count($v) > 9){ $shops_id = ''; $num = ''; for ($i = 1; $i <= count($v)-9 ; $i++){ // 判断是否在该店有库存 if ($v[8+$i] != null){ $shops = Shops::where(['name' => $excel_array[8+$i]])->find(); if (!$shops) throw new Exception('没有该店铺'.$excel_array[8+$i].',请在后台添加', 1); $shops_id = $shops['id'].','.$shops_id; $num = $v[8+$i].','.$num; } } $shops_ids = substr($shops_id,0, strlen($shops_id)-1); $nums = substr($num,0, strlen($num)-1); $data[$k]['num'] = $nums; $data[$k]['shop_id'] = $shops_ids; } } Db::commit(); success(); } catch (Exception $e) { Db::rollback(); error($e->getMessage()); } } ``` ### PHPExcel插入数据库内存溢出解决方案 - 修改本方法的配置文件,此属下策方案 > 方法1、扩大php默认分配内存 ``` ini_set("memory_limit", "13312M"); set_time_limit(0); ```