当前位置:Gxlcms > PHP教程 > ThinkPHP与PHPExcel冲突解决方法

ThinkPHP与PHPExcel冲突解决方法

时间:2021-07-01 10:21:17 帮助过:27人阅读

很早之前就知道有一个叫做PHPExcel的类(官方网站)可以用来操作Excel,一直没有机会尝试,今天试用发现无比强大,下载后的源码包里有详细文档,几乎能实现手工操作Excel能实现的一切功能。
一个简单的读取Excel的例子如下:
代码如下:
  1. <br>$inputFileType = 'Excel2007'; <br>$inputFileName = './public/files/import_user_template.xlsx'; <br>$sheetname = 'Sheet1'; <br>//指定Excel类型,创建一个reader <br>$objReader = PHPExcel_IOFactory::createReader($inputFileType); <br>//设置只读取数据,不包括公式和格式 <br>$objReader->setReadDataOnly(true); <br>//只读取指定的sheet <br>$objReader->setLoadSheetsOnly($sheetname); <br>$objPHPExcel = $objReader->load($inputFileName); <br>$curSheet = $objPHPExcel->getSheet(0); <br>//包含数据的最大列 <br>$allColumn = $curSheet->getHighestColumn(); <br>//包含数据的最大行 <br>$allRow = $curSheet->getHighestRow(); <br>for($currentRow = 1; $currentRow <= $allRow; $currentRow++){ <br>for($currentCol = 'A'; $currentCol <= $allColumn; $currentCol++){ <br>echo $curSheet->getCell($currentCol.$currentRow)->getValue()."\t"; <br>} <br>echo "\r\n"; <br>} <br> <br>要在ThinkPHP中使用,把源码包中的Classes目录复制到ThinkPHP的Vendor目录下,改名为PHPExcel,然后调用Vendor方法载入 <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>vendor('PHPExcel.PHPExcel'); <br> <br>可是这样一来发现读取Excel以后再调用M或者D方法实例化模型类时报找不到Model类的错误,经过研究发现是自动装载机制冲突,要解决冲突,需要在M或者D方法调用之前使用spl_autoload_register函数重新注册autoloader类 <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>spl_autoload_register(array('Think','autoload')); <br><br><strong>在ThinkPHP中调用PHPExcel的问题解决方案 <br></strong>在ThinkPHP中调用PHPExcel时,数据可以完全读出来,但是下一步D,M或调用模板的时候会出错。(不知道是我一个人遇到这个问题 吗?) <br>经过研究,终于找到了解决方法。和大家分享一下。呵呵! <br>1,首先下载PHPExcel的包,放在 ThinkPHP/Vendor/(也就是Think的第三方类库目录)下。 <br>2,调用函数。 <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>protected function Import_Execl($file){ <br>if(!file_exists($file)){ <br>return array("error"=>1); <br>} <br>Vendor("PHPExcel.PHPExcel"); <br>$PHPExcel = new PHPExcel(); <br>$PHPReader = new PHPExcel_Reader_Excel2007(); <br>if(!$PHPReader->canRead($file)){ <br>$PHPReader = new PHPExcel_Reader_Excel5(); <br>if(!$PHPReader->canRead($file)){ <br>return array("error"=>2); <br>} <br>} <br>$PHPExcel = $PHPReader->load($file); <br>$SheetCount = $PHPExcel->getSheetCount(); <br>for($i=0;$i<$SheetCount;$i++){ <br>$currentSheet = $PHPExcel->getSheet($i); <br>$allColumn = $this->ExcelChange($currentSheet->getHighestColumn()); <br>$allRow = $currentSheet->getHighestRow(); <br>$array[$i]["Title"] = $currentSheet->getTitle(); <br>$array[$i]["Cols"] = $allColumn; <br>$array[$i]["Rows"] = $allRow; <br>$arr = array(); <br>for($currentRow = 1 ;$currentRow<=$allRow;$currentRow++){ <br>$row = array(); <br>for($currentColumn=0;$currentColumn<$allColumn;$currentColumn++){ <br>$row[$currentColumn] = $currentSheet->getCellByColumnAndRow($currentColumn,$currentRow)->getValue(); <br>} <br>$arr[$currentRow] = $row; <br>} <br>$array[$i]["Content"] = $arr; <br>} <br>spl_autoload_register(array('Think','autoload'));//必须的,不然ThinkPHP和PHPExcel会冲突 <br>unset($currentSheet); <br>unset($PHPReader); <br>unset($PHPExcel); <br>unlink($file); <br>return array("error"=>0,"data"=>$array); <br>} <br>protected function ExcelChange($str){//配合Execl批量导入的函数 <br>$len = strlen($str)-1; <br>$num = 0; <br>for($i=$len;$i>=0;$i--){ <br>$num += (ord($str[$i]) - 64)*pow(26,$len-$i); <br>} <br>return $num; <br>} <br> <br>3,调用。 <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>public function import(){ <br>if(isset($_FILES["import"]) && ($_FILES["import"]["error"] == 0)){ <br>$result = $this->Import_Execl($_FILES["import"]["tmp_name"]); <br>if($this->Execl_Error[$result["error"]] == 0){ <br>$execl_data = $result["data"][0]["Content"]; <br>unset($execl_data[1]); <br>$data = D("Data"); <br>foreach($execl_data as $k=>$v){ <br>$d["serial_no"] = $v[0]; <br>$d["check_no"] = $v[1]; <br>$d["work_no"] = $v[2]; <br>$d["class_name"] = $v[3]; <br>$d["user_name"] = $v[4]; <br>$d["new_class"] = $v[5]; <br>$d["error_level"] = $v[6]; <br>$data->data($d)->add(); <br>} <br>$this->success($this->Execl_Error[$result["error"]]); <br>}else{ <br>$this->error($this->Execl_Error[$result["error"]]); <br>} <br>}else{ <br>$this->error("上传文件失败"); <br>} <br>} <br> <br>4,错误数据: <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>protected $Execl_Error = array("数据导入成功","找不到文件","Execl文件格式不正确"); <br></li><li> </li><li> </li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre></li></ol></pre>

人气教程排行