Posted in PHP onDecember 24, 2013
将Excel文件数据进行读取,并且返回错误的信息
/** * 导入商品基本信息 */ public function importProductBasicInfo($data){ include_once 'PHPExcel.php'; include_once 'PHPExcel/IOFactory.php'; include_once 'PHPExcel/Reader/Excel5.php'; // 定义一个错误集合. $error = array(); $resultInfo = null; $needNext = true; //上传文件到服务器指定位置 $fileName = $_FILES["productinfo"]['name']; $filePath = CBase_Common_UploadPicture::uploadFile($data["productinfo"], 'product'); //如果上传文件成功,就执行导入excel操作 if($filePath == 1) { $error[1] = "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值"; }else if($filePath == 4){ $error[4] = "没有文件被上传"; }else{ $objReader = PHPExcel_IOFactory::createReader('Excel5'); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load($filePath); $objWorksheet = $objPHPExcel->getActiveSheet(); $highestRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); $colums = array(); $data = array(); $excelAllId = array(); $excelIdRow = array(); $execlAllShopLinkedId = array(); for($i=0;$i<$highestColumnIndex;$i++){ $cValue = trim($objWorksheet->getCellByColumnAndRow($i,1)->getValue()); switch ($cValue) { case self::PRODUCT_SAP_CODE : $colums[$i] = "sap_code"; break; case self::PRODUCT_NAME : $colums[$i] = "pname"; break; case self::PRODUCT_GROUP : $colums[$i] = "product_group"; break; case self::PRODUCT_BRAND : $colums[$i] = 'product_brand'; break; case self::PRODUCT_PROXY_FLAG : $colums[$i] = "product_proxy_flag"; break; case self::PRODUCT_BINNING : $colums[$i] = "product_binning"; break; case self::PRODUCT_SELL_PICK : $colums[$i] = "product_sell_pick"; break; case self::PRODUCT_ATTRIBUTE : $colums[$i] = "product_attribute"; break; case self::PRODUCT_SUPPLIER_CODE : $colums[$i] = "vendor_code"; break; case self::PRODUCT_SUPPLY_ADDRESS : $colums[$i] = "zzwerk_code"; break; case self::PRODUCT_BATCH : $colums[$i] = "zzlgort_code"; break; default : $error[3][] = $cValue; break; } } //检测Excel中的基本信息是否存在 $dataCount = $highestRow - 1; if(count($colums) == 0) { $error[5] = "没有表头"; } else if(!in_array('sap_code',$colums)){ $error[2] = "表头中商品SAP编码不存在"; } else if($dataCount <= 0){ $error[6] = "Excel文件中没有数据"; } else if(count($error)==0){ for ($i=2;$i<=$highestRow;$i++){ $colkey = array_search('sap_code'); $shopLinkedIdValue = trim($objWorksheet->getCellByColumnAndRow($colkey,$i)->getValue()); if(!$shopLinkedIdValue) { continue; } if(in_array($shopLinkedIdValue,$execlAllShopLinkedId)){ $error[7][$shopLinkedIdValue]['duplicate'] = true; $error[7][$shopLinkedIdValue]['excelRow'][] = $i; $execlAllShopLinkedId[$i] = $shopLinkedIdValue; $error[7][$shopLinkedIdValue]['noId'] = true; }else { $excelIdRow[$shopLinkedIdValue] = $i; $execlAllShopLinkedId[$i] = $shopLinkedIdValue; } } $dealMultiple = ceil($dataCount / 1000); $allProduct = array(); for($i=0;$i<$dealMultiple;$i++){ $offset = $i*1000+2; $max = ($i+1)*1000+1; $max = ($max > $dataCount) ? $highestRow : $max; $allShopLinkedId = array(); for($j=$offset;$j<=$max;$j++){ if($execlAllShopLinkedId[$j]){ $allShopLinkedId[] = $execlAllShopLinkedId[$j]; } } // 根据SAP商品编码查询在库中的记录数. $dbShopProducts = $this->getShopLinkedByIds($allShopLinkedId); for($j=$offset;$j<=$max;$j++){ $product = array(); for($k=0;$k<$highestColumnIndex;$k++){ $tempV = trim($objWorksheet->getCellByColumnAndRow($k,$j)->getValue()); if($tempV && $tempV != '') { $product[$colums[$k]] = $tempV; } } //获取文件中的SAP编码 $id = $product['sap_code']; if(!$id){ continue; } //检测商品SAP编码是否已经存在 if(!in_array($id,$dbShopProducts)){ $allProduct[$id] = $product; }else{ $error[7][$id]['hasId'] = true; } //商品名是否为空 if(!isset($product['pname'])){ $error[7][$id]['emptyName'] = true; } //商品类目(商品组)是否为空 if(!isset($product['product_group'])){ $error[7][$id]['emptyProductGroup'] = true; } //产品层次(品牌)是否为空 if(!isset($product['product_brand'])){ $error[7][$id]['emptyProductBrand'] = true; } //经代销标志是否为空 if(!isset($product['product_proxy_flag'])){ $error[7][$id]['emptyProductProxyFlag'] = true; } //装箱清单是否为空 if(!isset($product['product_binning'])){ $error[7][$id]['emptyProductBinning'] = true; } //先销后采标识是否为空 if(!isset($product['product_sell_pick'])){ $error[7][$id]['emptyProductSellPick'] = true; } //商品属性是否为空 if(!isset($product['product_attribute'])){ $error[7][$id]['emptyProductAttribute'] = true; } //供应商编码是否为空 if(!isset($product['vendor_code'])){ $error[7][$id]['emptyVendorCode'] = true; } //供应地点是否为空 if(!isset($product['zzwerk_code'])){ $error[7][$id]['emptyZzwerkCode'] = true; } //库区是否为空 if(!isset($product['zzlgort_code'])){ $error[7][$id]['emptyZzlgortCode'] = true; } if(isset($error[7][$id])){ $error[7][$id]['excelRow'] = $j; } } } } } $resultInfo['fileName'] = $fileName; //返回错误信息 if(count($error)>0){ if(isset($error[1])){ $resultInfo['type'] = 1; $resultInfo['msg'] = $error[1]; }else if(isset($error[2])){ $resultInfo['type'] = 2; $resultInfo['msg'] = $error[2]; }else if(isset($error[3])){ $resultInfo['type'] = 3; $resultInfo['msg'] = '表头【'.implode(',',$error[3]).'】不存在'; }else if(isset($error[4])){ $resultInfo['type'] = 4; $resultInfo['msg'] = $error[4]; }else if(isset($error[6])){ $resultInfo['type'] = 6; $resultInfo['msg'] = $error[6]; }else if(isset($error[7])){ $excelName = null; $objPHPWriteExcel = new PHPExcel(); $objPHPWriteExcel->getProperties()->setCreator("yuer") ->setLastModifiedBy("yuer")->setTitle("")->setSubject("") ->setDescription("")->setKeywords("")->setCategory(""); $prefix = substr($fileName,0,strrpos($fileName,'.')); $suffix = substr($fileName,strrpos($fileName,'.')); $excelName = date("Y_m_d_H_i_s").'_'.mt_rand(1,99).'_'.$prefix.'ErrorReport'.$suffix; $excelName = Base_Tool_Pinyin::getPinyin($excelName); $objPHPWriteExcel->setActiveSheetIndex(0); $activeSheet = $objPHPWriteExcel->getActiveSheet(); $activeSheet->setTitle('错误报告'); $activeSheet->setCellValueByColumnAndRow(0,1,self::PRODUCT_SAP_CODE); $activeSheet->setCellValueByColumnAndRow(1,1,'原excel行号'); $activeSheet->setCellValueByColumnAndRow(2,1,'第几行编码存在重复'); $activeSheet->setCellValueByColumnAndRow(3,1,self::PRODUCT_NAME); $activeSheet->setCellValueByColumnAndRow(4,1,self::PRODUCT_GROUP); $activeSheet->setCellValueByColumnAndRow(5,1,self::PRODUCT_BRAND); $activeSheet->setCellValueByColumnAndRow(6,1,self::PRODUCT_PROXY_FLAG); $activeSheet->setCellValueByColumnAndRow(7,1,self::PRODUCT_BINNING); $activeSheet->setCellValueByColumnAndRow(8,1,self::PRODUCT_SELL_PICK); $activeSheet->setCellValueByColumnAndRow(9,1,self::PRODUCT_ATTRIBUTE); $activeSheet->setCellValueByColumnAndRow(10,1,self::PRODUCT_SUPPLIER_CODE); $activeSheet->setCellValueByColumnAndRow(11,1,self::PRODUCT_SUPPLY_ADDRESS); $activeSheet->setCellValueByColumnAndRow(12,1,self::PRODUCT_BATCH); $activeSheet->setCellValueByColumnAndRow(13,1,'其他原因'); $activeSheet->getColumnDimensionByColumn(0)->setWidth(15); $activeSheet->getColumnDimensionByColumn(1)->setWidth(20); $activeSheet->getColumnDimensionByColumn(2)->setWidth(20); $activeSheet->getColumnDimensionByColumn(3)->setWidth(20); $activeSheet->getColumnDimensionByColumn(4)->setWidth(20); $activeSheet->getColumnDimensionByColumn(5)->setWidth(20); $activeSheet->getColumnDimensionByColumn(6)->setWidth(20); $activeSheet->getColumnDimensionByColumn(7)->setWidth(20); $activeSheet->getColumnDimensionByColumn(8)->setWidth(20); $activeSheet->getColumnDimensionByColumn(9)->setWidth(20); $activeSheet->getColumnDimensionByColumn(10)->setWidth(20); $activeSheet->getColumnDimensionByColumn(11)->setWidth(20); $activeSheet->getColumnDimensionByColumn(12)->setWidth(20); $activeSheet->getColumnDimensionByColumn(13)->setWidth(20); $writeExcelIndex = 2; foreach ($error[7] as $pId=>$pInfo){ if(isset($pInfo['hasId'])){ $activeSheet->setCellValueByColumnAndRow(0,$writeExcelIndex,$pId.'-此供应商编码已经存在'); } else { $activeSheet->setCellValueByColumnAndRow(0,$writeExcelIndex,$pId); } $activeSheet->setCellValueByColumnAndRow(1,$writeExcelIndex,$pInfo['excelRow']); if(isset($pInfo['duplicate'])){ $activeSheet->setCellValueByColumnAndRow(2,$writeExcelIndex,$excelIdRow[$pId]); } if(isset($pInfo['emptyName'])){ $activeSheet->setCellValueByColumnAndRow(3,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyProductGroup'])){ $activeSheet->setCellValueByColumnAndRow(4,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyProductBrand'])){ $activeSheet->setCellValueByColumnAndRow(5,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyProductProxyFlag'])){ $activeSheet->setCellValueByColumnAndRow(6,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyProductBinning'])){ $activeSheet->setCellValueByColumnAndRow(7,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyProductSellPick'])){ $activeSheet->setCellValueByColumnAndRow(8,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyProductAttribute'])){ $activeSheet->setCellValueByColumnAndRow(9,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyVendorCode'])){ $activeSheet->setCellValueByColumnAndRow(10,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyZzwerkCode'])){ $activeSheet->setCellValueByColumnAndRow(11,$writeExcelIndex,'-为空'); } if(isset($pInfo['emptyZzlgortCode'])){ $activeSheet->setCellValueByColumnAndRow(12,$writeExcelIndex,'-为空'); } if(isset($pInfo['other'])){ $activeSheet->setCellValueByColumnAndRow(13,$writeExcelIndex,$pInfp['other']); } $writeExcelIndex++; } $objWriter = PHPExcel_IOFactory::createWriter($objPHPWriteExcel, 'Excel5'); $excelPath = FILE_PATH.DS.'feedback'.DS.$excelName; $objWriter->save($excelPath); $resultInfo['type'] = 7; $resultInfo['msg'] = $fileName."文件中存在错误"; $resultInfo['errorReport'] = $excelName; // 日志操作,暂时空着 } }else{ //导入数据 $logIds = ''; $i = 0; foreach ($allProduct as $pId => $pInfo){ $updateProductSql = 'insert into yr_product set '; if(isset($pInfo['pname']) && trim($pInfo['pname'])){ $updateProductSql = $updateProductSql.'pname=\''.str_replace('\'','\'\'',$pInfo['pname']).'\','; } //如果SAP编码不足18位,则用0从左开始补全 if(isset($pInfo['sap_code'])){ if(strlen($pInfo['sap_code'])<18){ $pInfo['sap_code'] = str_pad($pInfo['sap_code'], 18, "0", STR_PAD_LEFT); $updateProductSql = $updateProductSql.'sap_code=\''.str_replace('\'','\'\'',$pInfo['sap_code']).'\','; } } if(isset($pInfo['product_group'])){ $updateProductSql = $updateProductSql.'product_group=\''.$pInfo['product_group'].'\','; } if(isset($pInfo['product_brand'])){ $updateProductSql = $updateProductSql.'product_brand=\''.$pInfo['product_brand'].'\','; } if(isset($pInfo['product_proxy_flag'])){ $updateProductSql = $updateProductSql.'product_proxy_flag=\''.$pInfo['product_proxy_flag'].'\','; } if(isset($pInfo['product_binning'])){ $updateProductSql = $updateProductSql.'product_binning=\''.$pInfo['product_binning'].'\','; } if(isset($pInfo['product_sell_pick'])){ $updateProductSql = $updateProductSql.'product_sell_pick=\''.$pInfo['product_sell_pick'].'\','; } if(isset($pInfo['product_attribute'])){ $updateProductSql = $updateProductSql.'product_attribute=\''.$pInfo['product_attribute'].'\','; } if(isset($pInfo['vendor_code'])){ $updateProductSql = $updateProductSql.'vendor_code=\''.$pInfo['vendor_code'].'\','; } if(isset($pInfo['zzwerk_code'])){ $updateProductSql = $updateProductSql.'zzwerk_code=\''.$pInfo['zzwerk_code'].'\','; } if(isset($pInfo['zzlgort_code'])){ $updateProductSql = $updateProductSql.'zzlgort_code=\''.$pInfo['zzlgort_code'].'\''; } //最终的SQL语句 $result = $this->excuteMultiInsertSql($updateProductSql); } $resultInfo['type'] = 8; $resultInfo['msg'] = "导入商品基本信息成功"; /* * // 日志操作. * $content = '批量新建商品导入操作成功:导入的供应商品编码有->'; * $logData['content'] = $content.$logIds; */ } return $resultInfo; }
phpexcel导入excel数据使用方法实例
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@