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 的 __FILE__ 常量
Jan 15 PHP
php操作sqlserver关于时间日期读取的小小见解
Nov 29 PHP
PHP中date()日期函数有关参数整理
Jul 19 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
Jun 12 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php数组键值用法实例分析
Feb 27 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
Aug 30 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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
详解:――如何将图片储存在数据库里
2006/12/05 PHP
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
JavaScript中this详解
2015/09/01 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
python3实现基于用户的协同过滤
2018/05/31 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
python程序控制NAO机器人行走
2019/04/29 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
社区七一党员活动方案
2014/01/25 职场文书
主题酒店策划书
2014/01/28 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS