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 相关文章推荐
php4的session功能评述(一)
Oct 09 PHP
SSI指令
Nov 25 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
php 动态添加记录
Mar 10 PHP
关于php fread()使用技巧
Jan 22 PHP
来自phpguru得Php Cache类源码
Apr 15 PHP
PHP程序漏洞产生的原因分析与防范方法说明
Mar 06 PHP
thinkphp常见路径用法分析
Dec 02 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 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
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
关于vue面试题汇总
2018/03/20 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
Python hashlib模块加密过程解析
2019/11/05 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
《小儿垂钓》教学反思
2014/02/23 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
十佳党员事迹材料
2014/08/28 职场文书
学校实习推荐信
2015/03/27 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书