ThinkPHP与PHPExcel冲突解决方法
方法 解决 thinkphp 冲突 PHPExcel
2023-06-13 09:14:29 时间
很早之前就知道有一个叫做PHPExcel的类(官方网站)可以用来操作Excel,一直没有机会尝试,今天试用发现无比强大,下载后的源码包里有详细文档,几乎能实现手工操作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,调用函数。
protectedfunctionImport_Execl($file){
if(!file_exists($file)){
returnarray("error"=>1);
}
Vendor("PHPExcel.PHPExcel");
$PHPExcel=newPHPExcel();
$PHPReader=newPHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($file)){
$PHPReader=newPHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($file)){
returnarray("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);
returnarray("error"=>0,"data"=>$array);
}
protectedfunctionExcelChange($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,调用。
publicfunctionimport(){
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_dataas$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文件格式不正确");
相关文章
- 卸载LuDaShi时弹出“正在运行”“已被打开”的一种解决方法
- 无法解析的外部符号解决方法汇总[通俗易懂]
- code blocks使用方法总结「建议收藏」
- 分享mongos 崩溃后无法重启问题的解决方法
- Linux下删除默认路由的方法(删除linux默认路由)
- Linux网卡Down:排查及解决方法(linux网卡down)
- Linux 硬盘无法识别的排查及解决方法(linux无法识别硬盘)
- Oracle数据库端口被占用?不要紧,这些方法帮你解决!(Oracle端口被占用)
- MySQL关联删除实现方法详解(mysql关联删除)
- 快速导出Oracle数据库表的方法(oracle导出数据库表)
- 深入了解MySQL掌握这些方法优化你的数据库管理(MySQL中你了解的方法)
- Oracle 操作 Mdb 文件的使用方法(mdb文件用oracle)
- MySQL与服务器不兼容解决方法(mysql不兼容服务器)
- MySQL换行问题解决方法探讨(mysql不能换行吗)
- 库的解决方法(mysql不能创建数据)
- 一步步200让你搞懂Redis的链接使用方法(redis链接使用方法)
- Oracle TNS连接失败原因及解决方法(oracle tns报错)
- mysql"toomanyconnections"错误之mysql解决方法
- jQuery1.5.1animate方法源码阅读
- ThinkPHP自动验证失败的解决方法
- 删除DataTable重复列,只删除其中的一列重复行的解决方法
- 使用checked语句防止数据溢出的解决方法
- 浅析打开eclipse出现IncompatibleJVM的解决方法
- IIS7中Ajax.AjaxMethod无效的原因及解决方法
- jquery交替变换颜色的三种方法实例代码
- thinkphp验证码显示不出来的解决方法
- ASP在ACCESS中模糊查询"内存溢出"的解决方法
- Jquery基于Ajax方法自定义无刷新提交表单Form实例
- php实现事件监听与触发的方法
- ThinkPHP控制器里javascript代码不能执行的解决方法
- ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
- ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
- C#实现将汉字转化为2位大写的16进制Unicode的方法
- Linux下大量SYN_SENT连接问题的解决方法
- ThinkPHP调用common/common.php函数提示错误functionundefined的解决方法