声明:phpexcel 的坑,上传文件必须是 xls 格式的,走的是excel5的类,如果是别的格式则报错,图片处理方法不存在
xls模板内容:
以下是代码:
<div class="layui-inline"> <button type="button" class="layui-btn layui-btn-normal" id="test3"><i class="layui-icon"></i>上传文件</button> </div> <script> layui.use(['upload', 'element'], function(){ var $ = layui.jquery ,upload = layui.upload ,element = layui.element; upload.render({ elem: '#test3' ,url: "{:url('/Nqishare/import')}" ,accept: 'file' ,before: function(obj){ console.log(this.item); } ,done: function(res){ if(res.status==1){ layer.msg(res.msg, { time: 3000, //6s后自动关闭 icon:1 }); }else{ layer.msg(res.msg, { time: 3000, //6s后自动关闭 icon:2 }); } console.log(res) } }); }); </script>
后端:
tp6 将phpexce放到vendor下
require_once(root_path() . '/vendor/phpexcel/PHPExcel.php');
require_once(root_path() . '/vendor/phpexcel/PHPExcel/IOFactory.php');
//表格导入 public function import() { set_time_limit(0); if (!empty($_FILES)) { //获取表单上传文件 if (!empty($_FILES['file']['error'])) { return array('status' => 0, 'msg' => '文件上传失败'); } $tmp_file = $_FILES ['file'] ['tmp_name']; $file_types = explode(".", $_FILES ['file'] ['name']); $file_type = $file_types [count($file_types) - 1]; /*判别是不是.xls文件,判别是不是excel文件*/ if (strtolower($file_type) != "xlsx" && strtolower($file_type) != "xls") { return array('status' => 0, 'msg' => '不是Excel文件,重新上传'); } /*设置上传路径*/ /*百度有些文章写的上传路径经过编译之后斜杠不对。不对的时候用大写的DS代替,然后用连接符链接就可以拼凑路径了。*/ $savePath = root_path() . 'public/uploads/';/*以时间来命名上传的文件*/ $str = date('Ymdhis'); $file_name = $str . "." . $file_type; /*是否上传成功*/ if (!copy($tmp_file, $savePath . $file_name)) { return array('status' => 0, 'msg' => '上传失败'); } /* *注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入 */ $res = $this->read($savePath . $file_name, "UTF-8", $file_type);//传参,判断office2007还是office2003 Db::startTrans(); try { /*对生成的数组进行数据库的写入*/ foreach ($res as $k => $v) { //如果导入数据为空,跳过 if (empty(array_filter($v))) continue; if ($k > 1) { $isspe = $v[13] == "是"?1:0; // $res = DB::name('nqi_company')->field('company_id')->where(['company_contact_phone' => $v[7]])->find(); $res = DB::name('nqi_company')->field('company_id,company_contact_phone') ->where('company_name','like','%'.$v[32].'%') ->where('company_contact_phone','=',$v[7]) ->find(); //pp($res);die; if(empty($res)){ throw new \Exception('手机号:'.$v[32].'未查到公司信息'); } //$butime = $v[11]; $butime = date("Y-m-d H:i:s",strtotime($v[11])); //pp($butime);die; $company_id = $res['company_id']; $mblength = mb_strlen($v[0], 'UTF8'); $data[$k]['equipment_id'] = uuid(); $data[$k]['company_id'] = $company_id; $data[$k]['equipment_status'] = 1; $data[$k]['equipment_name'] = $v[1]; $data[$k]['scope_of_application'] = $v[2]; $data[$k]['equipment_modle'] = $v[3]; $data[$k]['equipment_image'] = $v[4];//这里就是图片地址 $data[$k]['manufacturer'] = $v[5]; $data[$k]['contact'] = $v[6]; 。。。。。。。。。。。。。。。。。。。。。。。。。。 } }//pp($data);die;pp($coord);pp($maintance);die; $result = Db::name('*****')->insertAll($data); $coordres = Db::name('******')->insertAll($coord); $maintanceres = Db::name('**********')->insertAll($maintance); if (!$result) { throw new \Exception('*****:'.$v[1].'***表添加错误'); } if (!$coordres) { throw new \Exception('****:'.$v[1].'*****表添加错误'); } if (!$maintanceres) { throw new \Exception('******:'.$v[1].'*****添加错误'); } Db::commit(); return array('status' => 1, 'msg' => "导入成功"); } catch (\Exception $e) { Db::rollback(); return array('status' => 0, 'msg' => $e->getMessage()); } } } /** * 导入方法附属方法 * @param * @param * @return */ public function read($filename, $encode, $file_type) { if (strtolower($file_type) == 'xls')//判断excel表类型为2003还是2007//如果要上传表格中的图片,必须为xls格式表格,用excel5 得类,excel2007会报错 { $objReader = \PHPExcel_IOFactory::createReader('Excel5'); } elseif (strtolower($file_type) == 'xlsx') { $objReader = \PHPExcel_IOFactory::createReader('Excel2007'); } $objReader->setReadDataOnly(false); $objPHPExcel = $objReader->load($filename); $objWorksheet = $objPHPExcel->getActiveSheet(); $highestRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); $highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn); $excelData = array();//返回excel表中数据 for ($row = 1; $row <= $highestRow; $row++) { for ($col = 0; $col < $highestColumnIndex; $col++) { $excelData[$row][] = (string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); } } if (strtolower($file_type) == 'xls'){ //单独处理excel中的图片,格式必须是xls的才可以, $imgData = array(); $imageFilePath = '/uploads/excel/';//图片保存目录 if (! file_exists ( $imageFilePath )) { mkdir("$imageFilePath", 0777, true); } foreach($objWorksheet->getDrawingCollection() as $img){ list ($startColumn, $startRow) = \PHPExcel_Cell::coordinateFromString($img->getCoordinates());//获取列与行号 $imageFileName=date('YmdHis').$startRow.time().mt_rand(100,9999); /*表格解析后图片会以资源形式保存在对象中,可以通过getImageResource函数直接获取图片资源然后写入本地文件中*/ switch ($img->getMimeType()){//处理图片格式 case 'image/jpg': case 'image/jpeg': $imageFileName.='.jpg'; imagejpeg($img->getImageResource(),$imageFilePath.$imageFileName); break; case 'image/gif': $imageFileName.='.gif'; imagegif($img->getImageResource(),$imageFilePath.$imageFileName); break; case 'image/png': $imageFileName.='.png'; imagepng($img->getImageResource(),$imageFilePath.$imageFileName); break; } $imgData[$startRow][$startColumn]= $imageFilePath.$imageFileName;//追加到数组中去 /*[2] => Array ( [E] => /uploads/excel/20211221150435216400702751912.png )*/ } /*foreach ($objWorksheet->getDrawingCollection() as $key=>$img ){ list ($startColumn, $startRow ) = \PHPExcel_Cell::coordinateFromString($img->getCoordinates()); //获取列与行号 $imageFileName = $img ->getCoordinates().mt_rand(100,999); $filename = $img->getIndexedFilename(); //文件名 ob_start(); call_user_func( $img->getRenderingFunction(), $img->getImageResource() ); $imageContents = ob_get_contents(); file_put_contents($imageFilePath.$filename,$imageContents); //把文件保存到本地 ob_end_clean(); $imgData [ $startRow ][ $startColumn ]= '/'.$imageFilePath.$filename ; //追加到数组中去 }*/ // 处理图片数组与excelData 结合 if(!empty($imgData)){ foreach ($imgData as $key => $value) { //$excelData[$key][4] 是导入模板的代表图片的哪一行 $excelData[$key][4] = $value['E']; } } } return $excelData; } //导出excel public function outexcel() { }