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 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
怎样才能成为PHP高手?学会“懒惰”的编程
Dec 05 PHP
C# Assembly类访问程序集信息
Jun 13 PHP
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
深入apache host的配置详解
Jun 09 PHP
PHP积分兑换接口实例
Feb 09 PHP
PHP自动生成表单代码分享
Jun 19 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
Sep 26 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
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
一些常用的Javascript函数
2006/12/22 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
英文自荐信
2013/12/15 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书