手机
当前位置:查字典教程网 >编程开发 >php教程 >ThinkPHP与PHPExcel冲突解决方法
ThinkPHP与PHPExcel冲突解决方法
摘要:很早之前就知道有一个叫做PHPExcel的类(官方网站)可以用来操作Excel,一直没有机会尝试,今天试用发现无比强大,下载后的源码包里有详...

很早之前就知道有一个叫做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 "rn";

}

要在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,调用函数。

复制代码 代码如下:

protected function Import_Execl($file){

if(!file_exists($file)){

return array("error"=>1);

}

Vendor("PHPExcel.PHPExcel");

$PHPExcel = new PHPExcel();

$PHPReader = new PHPExcel_Reader_Excel2007();

if(!$PHPReader->canRead($file)){

$PHPReader = new PHPExcel_Reader_Excel5();

if(!$PHPReader->canRead($file)){

return array("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);

return array("error"=>0,"data"=>$array);

}

protected function ExcelChange($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,调用。

复制代码 代码如下:

public function import(){

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_data as $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文件格式不正确");

【ThinkPHP与PHPExcel冲突解决方法】相关文章:

浅谈Windows下 PHP4.0与oracle 8的连接设置

WordPress博客程序常见错误的解决方法

PHP IDE PHPStorm配置支持友好Laravel代码提示方法

php获取系统变量方法小结

php开发中的页面跳转方法总结

PHP file_get_contents函数读取远程数据超时的解决方法

php采集中国代理服务器网的方法

PHP实现即时输出、实时输出内容方法

PHP和JAVA的XML-RPC中文问题解决办法

PHP生成唯一订单号的方法汇总

精品推荐
分类导航