ThinkPHP与PHPExcel冲突解决方法


Posted in PHP onAugust 08, 2011

很早之前就知道有一个叫做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,调用函数。
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文件格式不正确");
PHP 相关文章推荐
PHP 和 MySQL 基础教程(二)
Oct 09 PHP
mysql建立外键
Nov 25 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
Destoon实现多表查询示例
Aug 21 PHP
详解php的socket通信
Aug 11 PHP
php实现遍历多维数组的方法
Nov 25 PHP
php获取当前url地址的方法小结
Jan 10 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 PHP
提高Laravel应用性能方法详解
Jun 24 PHP
PHP 出现 http500 错误的解决方法
Mar 09 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 #PHP
php Smarty初体验二 获取配置信息
Aug 08 #PHP
php中Smarty模板初体验
Aug 08 #PHP
PHP 防注入函数(格式化数据)
Aug 08 #PHP
PHP中将数组转成XML格式的实现代码
Aug 08 #PHP
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 #PHP
php记录日志的实现代码
Aug 08 #PHP
You might like
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
第五节--克隆
2006/11/16 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python socket 超时设置 errno 10054
2014/07/01 Python
Python中itertools模块用法详解
2014/09/25 Python
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
个人简历中的自我评价范例
2013/10/29 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
小摄影师教学反思
2014/04/27 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
优秀党员推荐材料
2014/12/18 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
贷款收入证明范本
2015/06/12 职场文书
升职自荐书
2019/05/09 职场文书
MySQL基础(二)
2021/04/05 MySQL
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python