zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ThinkPHP与PHPExcel冲突解决方法

方法 解决 thinkphp 冲突 PHPExcel
2023-06-13 09:14:29 时间
很早之前就知道有一个叫做PHPExcel的类(官方网站)可以用来操作Excel,一直没有机会尝试,今天试用发现无比强大,下载后的源码包里有详细文档,几乎能实现手工操作Excel能实现的一切功能。
一个简单的读取Excel的例子如下:
复制代码代码如下:

$inputFileType="Excel2007";
$inputFileName="./public/files/import_user_template.xlsx";
$sheetname="Sheet1";
//指定Excel类型,创建一个reader
$objReader=PHPExcel_IOFactory::createReader($inputFileType);
//设置只读取数据,不包括公式和格式
$objReader->setReadDataOnly(true);
//只读取指定的sheet
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel=$objReader->load($inputFileName);
$curSheet=$objPHPExcel->getSheet(0);
//包含数据的最大列
$allColumn=$curSheet->getHighestColumn();
//包含数据的最大行
$allRow=$curSheet->getHighestRow();
for($currentRow=1;$currentRow<=$allRow;$currentRow++){
for($currentCol="A";$currentCol<=$allColumn;$currentCol++){
echo$curSheet->getCell($currentCol.$currentRow)->getValue()."\t";
}
echo"\r\n";
}

要在ThinkPHP中使用,把源码包中的Classes目录复制到ThinkPHP的Vendor目录下,改名为PHPExcel,然后调用Vendor方法载入
复制代码代码如下:

vendor("PHPExcel.PHPExcel");

可是这样一来发现读取Excel以后再调用M或者D方法实例化模型类时报找不到Model类的错误,经过研究发现是自动装载机制冲突,要解决冲突,需要在M或者D方法调用之前使用spl_autoload_register函数重新注册autoloader类
复制代码代码如下:
spl_autoload_register(array("Think","autoload"));

在ThinkPHP中调用PHPExcel的问题解决方案
在ThinkPHP中调用PHPExcel时,数据可以完全读出来,但是下一步D,M或调用模板的时候会出错。(不知道是我一个人遇到这个问题吗?)
经过研究,终于找到了解决方法。和大家分享一下。呵呵!
1,首先下载PHPExcel的包,放在ThinkPHP/Vendor/(也就是Think的第三方类库目录)下。
2,调用函数。
复制代码代码如下:
protectedfunctionImport_Execl($file){
if(!file_exists($file)){
returnarray("error"=>1);
}
Vendor("PHPExcel.PHPExcel");
$PHPExcel=newPHPExcel();
$PHPReader=newPHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($file)){
$PHPReader=newPHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($file)){
returnarray("error"=>2);
}
}
$PHPExcel=$PHPReader->load($file);
$SheetCount=$PHPExcel->getSheetCount();
for($i=0;$i<$SheetCount;$i++){
$currentSheet=$PHPExcel->getSheet($i);
$allColumn=$this->ExcelChange($currentSheet->getHighestColumn());
$allRow=$currentSheet->getHighestRow();
$array[$i]["Title"]=$currentSheet->getTitle();
$array[$i]["Cols"]=$allColumn;
$array[$i]["Rows"]=$allRow;
$arr=array();
for($currentRow=1;$currentRow<=$allRow;$currentRow++){
$row=array();
for($currentColumn=0;$currentColumn<$allColumn;$currentColumn++){
$row[$currentColumn]=$currentSheet->getCellByColumnAndRow($currentColumn,$currentRow)->getValue();
}
$arr[$currentRow]=$row;
}
$array[$i]["Content"]=$arr;
}
spl_autoload_register(array("Think","autoload"));//必须的,不然ThinkPHP和PHPExcel会冲突
unset($currentSheet);
unset($PHPReader);
unset($PHPExcel);
unlink($file);
returnarray("error"=>0,"data"=>$array);
}
protectedfunctionExcelChange($str){//配合Execl批量导入的函数
$len=strlen($str)-1;
$num=0;
for($i=$len;$i>=0;$i--){
$num+=(ord($str[$i])-64)*pow(26,$len-$i);
}
return$num;
}

3,调用。
复制代码代码如下:
publicfunctionimport(){
if(isset($_FILES["import"])&&($_FILES["import"]["error"]==0)){
$result=$this->Import_Execl($_FILES["import"]["tmp_name"]);
if($this->Execl_Error[$result["error"]]==0){
$execl_data=$result["data"][0]["Content"];
unset($execl_data[1]);
$data=D("Data");
foreach($execl_dataas$k=>$v){
$d["serial_no"]=$v[0];
$d["check_no"]=$v[1];
$d["work_no"]=$v[2];
$d["class_name"]=$v[3];
$d["user_name"]=$v[4];
$d["new_class"]=$v[5];
$d["error_level"]=$v[6];
$data->data($d)->add();
}
$this->success($this->Execl_Error[$result["error"]]);
}else{
$this->error($this->Execl_Error[$result["error"]]);
}
}else{
$this->error("上传文件失败");
}
}

4,错误数据:
复制代码代码如下:
protected$Execl_Error=array("数据导入成功","找不到文件","Execl文件格式不正确");