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 print类函数使用总结
Jun 25 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
PHP获取文本框、密码域、按钮的值实例代码
Apr 19 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP token验证生成原理实例分析
Jun 05 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获取访问者IP地址汇总
2015/04/24 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
JavaScript静态的动态
2006/09/18 Javascript
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
js实现表格筛选功能
2017/01/18 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
小程序实现密码输入框
2020/11/16 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
Python编写百度贴吧的简单爬虫
2015/04/02 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
应聘面试自我评价
2014/01/24 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
大学开学感言
2015/08/01 职场文书
医院病假条怎么写
2015/08/17 职场文书
竞聘书的秘诀
2019/04/02 职场文书
MySQL一些常用高级SQL语句
2021/07/03 MySQL
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android