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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 PHP
解析PHP的session过期设置
Jun 29 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
PHP会员找回密码功能的简单实现
Sep 05 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 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
文章推荐系统(二)
2006/10/09 PHP
用PHP实现的随机广告显示代码
2007/06/14 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python实现Kmeans聚类算法
2020/06/10 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
python打包多类型文件的操作方法
2020/09/21 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
幼儿园教师个人反思
2014/01/30 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
销售2014年度工作总结
2014/12/08 职场文书
云台山导游词
2015/02/03 职场文书
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android