ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例


Posted in PHP onJuly 22, 2014

本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方法,很多人可能不能正确的实现Excel的导入导出,问题基本上都是phpExcel的核心类引用路径出错造成的,如果有问题大家务必要对路劲是否引用正确进行测试。

具体操作步骤如下:

(一)导入Excel

第一,在前台html页面进行上传文件:如:

<form method="post" action="php文件" enctype="multipart/form-data">
 <h3>导入Excel表:</h3><input type="file" name="file_stu" />

 <input type="submit" value="导入" />
</form>

第二,在对应的php文件进行文件的处理

if (! empty ( $_FILES ['file_stu'] ['name'] )) 
 {
 $tmp_file = $_FILES ['file_stu'] ['tmp_name'];
 $file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );
 $file_type = $file_types [count ( $file_types ) - 1];
  /*判别是不是.xls文件,判别是不是excel文件*/
  if (strtolower ( $file_type ) != "xls")    
 {
   $this->error ( '不是Excel文件,重新上传' );
  }
 /*设置上传路径*/
  $savePath = SITE_PATH . '/public/upfile/Excel/';
 /*以时间来命名上传的文件*/
  $str = date ( 'Ymdhis' ); 
  $file_name = $str . "." . $file_type;
  /*是否上传成功*/
  if (! copy ( $tmp_file, $savePath . $file_name )) 
  {
   $this->error ( '上传失败' );
  }
 /*
  *对上传的Excel数据进行处理生成编程数据,这个函数会在下面第三步的ExcelToArray类中

  注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入
 */
 $res = Service ( 'ExcelToArray' )->read ( $savePath . $file_name );
 /*
  重要代码 解决Thinkphp M、D方法不能调用的问题 
  如果在thinkphp中遇到M 、D方法失效时就加入下面一句代码
 */
 //spl_autoload_register ( array ('Think', 'autoload' ) );
 /*对生成的数组进行数据库的写入*/
 foreach ( $res as $k => $v ) 
 {
  if ($k != 0) 
  {
   $data ['uid'] = $v [0];
   $data ['password'] = sha1 ( '111111' );
   $data ['email'] = $v [1];
   $data ['uname'] = $v [3];
   $data ['institute'] = $v [4];
   $result = M ( 'user' )->add ( $data );
   if (! $result) 
   {
    $this->error ( '导入数据库失败' );
   }
  }
 }
}

第三:ExcelToArrary类,用来引用phpExcel并处理Excel数据的
此处注意:ExcelToArrary类建在根目录下的 addons /services/ExcelToArrary.class.php中

class ExcelToArrary extends Service{
 public function __construct() {
  /*导入phpExcel核心类 注意 :你的路径跟我不一样就不能直接复制*/
  include_once('./Excel/PHPExcel.php');
 }
/**
* 读取excel $filename 路径文件名 $encode 返回数据的编码 默认为utf8
*以下基本都不要修改
*/ 
public function read($filename,$encode='utf-8'){
   $objReader = PHPExcel_IOFactory::createReader('Excel5'); 
   $objReader->setReadDataOnly(true); 
   $objPHPExcel = $objReader->load($filename); 
   $objWorksheet = $objPHPExcel->getActiveSheet(); 
  $highestRow = $objWorksheet->getHighestRow(); 
  $highestColumn = $objWorksheet->getHighestColumn(); 
 $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 
  $excelData = array(); 
  for ($row = 1; $row <= $highestRow; $row++) { 
  for ($col = 0; $col < $highestColumnIndex; $col++) { 
     $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
   } 
   } 
  return $excelData; 
 }  
 }

第四,以上就是导入的全部内容,phpExcel包附在最后。

(二)Excel的导出(相对于导入简单多了)

第一,先查出数据库里面要生成Excel的数据,如:

$data= M('User')->findAll(); //查出数据
$name='Excelfile'; //生成的Excel文件文件名
$res=service('ExcelToArrary')->push($data,$name);

第二,ExcelToArrary类,用来引用phpExcel并处理数据的   

class ExcelToArrary extends Service{
public function __construct() {
  /*导入phpExcel核心类 注意 :你的路径跟我不一样就不能直接复制*/
  include_once('./Excel/PHPExcel.php');
}
/* 导出excel函数*/
public function push($data,$name='Excel'){
 error_reporting(E_ALL);
 date_default_timezone_set('Europe/London');
 $objPHPExcel = new PHPExcel();

/*以下是一些设置 ,什么作者 标题啊之类的*/
 $objPHPExcel->getProperties()->setCreator("转弯的阳光")
   ->setLastModifiedBy("转弯的阳光")
   ->setTitle("数据EXCEL导出")
   ->setSubject("数据EXCEL导出")
   ->setDescription("备份数据")
   ->setKeywords("excel")
  ->setCategory("result file");
 /*以下就是对处理Excel里的数据, 横着取数据,主要是这一步,其他基本都不要改*/
foreach($data as $k => $v){
  $num=$k+1;
  $objPHPExcel->setActiveSheetIndex(0)
 //Excel的第A列,uid是你查出数组的键值,下面以此类推
 ->setCellValue('A'.$num, $v['uid']) 
 ->setCellValue('B'.$num, $v['email'])
 ->setCellValue('C'.$num, $v['password'])
 }
 $objPHPExcel->getActiveSheet()->setTitle('User');
 $objPHPExcel->setActiveSheetIndex(0);
  header('Content-Type: application/vnd.ms-excel');
  header('Content-Disposition: attachment;filename="'.$name.'.xls"');
  header('Cache-Control: max-age=0');
  $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
  $objWriter->save('php://output');
  exit;
}

第三,以上就是导出的全部内容,phpExcel本站下载地址https://3water.com/codes/194070.html

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
写出高质量的PHP程序
Feb 04 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
php实现事件监听与触发的方法
Nov 21 PHP
php实现两表合并成新表并且有序排列的方法
Dec 05 PHP
php实现通用的信用卡验证类
Mar 24 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 #PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 #PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 #PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 #PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 #PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 #PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 #PHP
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
php下实现折线图效果的代码
2007/04/28 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
import的本质解析
2017/10/30 Python
Python实现的栈(Stack)
2018/01/26 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
大学专科生推荐信范文
2013/11/23 职场文书
管理专员自荐信
2014/01/26 职场文书
学校运动会报道稿
2014/09/23 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript