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 相关文章推荐
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
PHP5 面向对象程序设计
Feb 13 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
PHP生成Gif图片验证码
Oct 27 PHP
php生成静态页面的简单示例
Apr 17 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
Jun 20 PHP
帝国cms目录结构分享
Jul 06 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 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生成图片缩略图类示例
2017/01/12 PHP
php微信开发之关注事件
2018/06/14 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
JavaScript 继承详解(一)
2009/07/13 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
python lxml中etree的简单应用
2019/05/10 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
学生感冒英文请假条
2014/02/04 职场文书
企业负责人任命书
2014/06/05 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
承诺函格式模板
2015/01/21 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang