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 相关文章推荐
推荐文章系统(一)
Oct 09 PHP
PHP 递归效率分析
Nov 24 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
PHP遍历数组的几种方法
Mar 22 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
调整PHP的性能
Oct 30 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
php 多继承的几种常见实现方法示例
Nov 18 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与javascript实现变量交互的示例代码
2013/07/23 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
jquery里的正则表达式说明
2011/08/03 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
python中函数默认值使用注意点详解
2016/06/01 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
python虚拟环境完美部署教程
2019/08/06 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
工程地质勘察专业大学生求职信
2013/10/13 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
党支部审查意见
2015/06/02 职场文书
电视新闻稿
2015/07/17 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript