Discuz教程网

ThinkPHP与PHPExcel冲突解决方法

[复制链接]
authicon dly 发表于 2011-9-3 18:58:24 | 显示全部楼层 |阅读模式
很早之前就知道有一个叫做PHPExcel的类(官方网站)可以用来操作Excel,一直没有机会尝试,今天试用发现无比强大,下载后的源码包里有详细文档,几乎能实现手工操作Excel能实现的一切功能。
一个简单的读取Excel的例子如下:
代码如下:

  1. $inputFileType = 'Excel2007';
  2. $inputFileName = './public/files/import_user_template.xlsx';
  3. $sheetname = 'Sheet1';
  4. //指定Excel类型,创建一个reader
  5. $objReader = PHPExcel_IOFactory::createReader($inputFileType);
  6. //设置只读取数据,不包括公式和格式
  7. $objReader->setReadDataOnly(true);
  8. //只读取指定的sheet
  9. $objReader->setLoadSheetsOnly($sheetname);
  10. $objPHPExcel = $objReader->load($inputFileName);
  11. $curSheet = $objPHPExcel->getSheet(0);
  12. //包含数据的最大列
  13. $allColumn = $curSheet->getHighestColumn();
  14. //包含数据的最大行
  15. $allRow = $curSheet->getHighestRow();
  16. for($currentRow = 1; $currentRow <= $allRow; $currentRow++){
  17. for($currentCol = 'A'; $currentCol <= $allColumn; $currentCol++){
  18. echo $curSheet->getCell($currentCol.$currentRow)->getValue()."\t";
  19. }
  20. echo "\r\n";
  21. }
复制代码




要在ThinkPHP中使用,把源码包中的Classes目录复制到ThinkPHP的Vendor目录下,改名为PHPExcel,然后调用Vendor方法载入
代码如下:

  1. vendor('PHPExcel.PHPExcel');
复制代码




可是这样一来发现读取Excel以后再调用M或者D方法实例化模型类时报找不到Model类的错误,经过研究发现是自动装载机制冲突,要解决冲突,需要在M或者D方法调用之前使用spl_autoload_register函数重新注册autoloader类
代码如下:

  1. spl_autoload_register(array('Think','autoload'));
复制代码



在ThinkPHP中调用PHPExcel的问题解决方案
在ThinkPHP中调用PHPExcel时,数据可以完全读出来,但是下一步D,M或调用模板的时候会出错。(不知道是我一个人遇到这个问题 吗?)
经过研究,终于找到了解决方法。和大家分享一下。呵呵!
1,首先下载PHPExcel的包,放在 ThinkPHP/Vendor/(也就是Think的第三方类库目录)下。
2,调用函数。
代码如下:

  1. protected function Import_Execl($file){
  2. if(!file_exists($file)){
  3. return array("error"=>1);
  4. }
  5. Vendor("PHPExcel.PHPExcel");
  6. $PHPExcel = new PHPExcel();
  7. $PHPReader = new PHPExcel_Reader_Excel2007();
  8. if(!$PHPReader->canRead($file)){
  9. $PHPReader = new PHPExcel_Reader_Excel5();
  10. if(!$PHPReader->canRead($file)){
  11. return array("error"=>2);
  12. }
  13. }
  14. $PHPExcel = $PHPReader->load($file);
  15. $SheetCount = $PHPExcel->getSheetCount();
  16. for($i=0;$i<$SheetCount;$i++){
  17. $currentSheet = $PHPExcel->getSheet($i);
  18. $allColumn = $this->ExcelChange($currentSheet->getHighestColumn());
  19. $allRow = $currentSheet->getHighestRow();
  20. $array[$i]["Title"] = $currentSheet->getTitle();
  21. $array[$i]["Cols"] = $allColumn;
  22. $array[$i]["Rows"] = $allRow;
  23. $arr = array();
  24. for($currentRow = 1 ;$currentRow<=$allRow;$currentRow++){
  25. $row = array();
  26. for($currentColumn=0;$currentColumn<$allColumn;$currentColumn++){
  27. $row[$currentColumn] = $currentSheet->getCellByColumnAndRow($currentColumn,$currentRow)->getValue();
  28. }
  29. $arr[$currentRow] = $row;
  30. }
  31. $array[$i]["Content"] = $arr;
  32. }
  33. spl_autoload_register(array('Think','autoload'));//必须的,不然ThinkPHP和PHPExcel会冲突
  34. unset($currentSheet);
  35. unset($PHPReader);
  36. unset($PHPExcel);
  37. unlink($file);
  38. return array("error"=>0,"data"=>$array);
  39. }
  40. protected function ExcelChange($str){//配合Execl批量导入的函数
  41. $len = strlen($str)-1;
  42. $num = 0;
  43. for($i=$len;$i>=0;$i--){
  44. $num += (ord($str[$i]) - 64)*pow(26,$len-$i);
  45. }
  46. return $num;
  47. }
复制代码



3,调用。
代码如下:

  1. public function import(){
  2. if(isset($_FILES["import"]) && ($_FILES["import"]["error"] == 0)){
  3. $result = $this->Import_Execl($_FILES["import"]["tmp_name"]);
  4. if($this->Execl_Error[$result["error"]] == 0){
  5. $execl_data = $result["data"][0]["Content"];
  6. unset($execl_data[1]);
  7. $data = D("Data");
  8. foreach($execl_data as $k=>$v){
  9. $d["serial_no"] = $v[0];
  10. $d["check_no"] = $v[1];
  11. $d["work_no"] = $v[2];
  12. $d["class_name"] = $v[3];
  13. $d["user_name"] = $v[4];
  14. $d["new_class"] = $v[5];
  15. $d["error_level"] = $v[6];
  16. $data->data($d)->add();
  17. }
  18. $this->success($this->Execl_Error[$result["error"]]);
  19. }else{
  20. $this->error($this->Execl_Error[$result["error"]]);
  21. }
  22. }else{
  23. $this->error("上传文件失败");
  24. }
  25. }
复制代码



4,错误数据:
代码如下:

  1. protected $Execl_Error = array("数据导入成功","找不到文件","Execl文件格式不正确");
复制代码








上一篇:ThinkPHP 防止表单重复提交的方法
下一篇:让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 01:19

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表