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 相关文章推荐
附件名前加网站名
Mar 23 PHP
php继承的一个应用
Sep 06 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 PHP
浅谈php常用的7大框架的优缺点
Jul 20 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测试硬盘写入速度示例
2014/01/27 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
js实现通过开始结束控制的计时器
2019/02/25 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
简单解决Python文件中文编码问题
2015/11/22 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
Python2与Python3的区别实例总结
2019/04/17 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
JBL英国官网:JBL UK
2018/07/04 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
局域网定义和特性
2016/01/23 面试题
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
秋游活动策划方案
2014/02/16 职场文书
催款通知书范文
2015/04/17 职场文书