利用phpExcel实现Excel数据的导入导出(全步骤详细解析)


Posted in PHP onNovember 26, 2013

很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人研究phpExcel的使用例程总结出来的使用方法,接下来直接进入正题。

首先先说一下,本人的这段例程是使用在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数据的
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包附在最后。
PHP 相关文章推荐
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
php控制文件下载速度的方法
Mar 24 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
ThinkPHP模型详解
Jul 27 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
php数组去重实例及分析
Nov 26 #PHP
php三维数组去重(示例代码)
Nov 26 #PHP
php导出word格式数据的代码实例
Nov 25 #PHP
php页面防重复提交方法总结
Nov 25 #PHP
php用header函数实现301跳转代码实例
Nov 25 #PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 #PHP
php使浏览器直接下载pdf文件的方法
Nov 15 #PHP
You might like
56.com视频采集接口程序(PHP)
2007/09/22 PHP
php 缓存函数代码
2008/08/27 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
详解小白之KMP算法及python实现
2019/04/04 Python
Python笔记之观察者模式
2019/11/20 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
心得体会开头
2014/01/01 职场文书
通信生自我鉴定
2014/01/18 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
师德师风事迹材料
2014/12/20 职场文书
公务员年度个人总结
2015/02/12 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2019个人工作总结
2019/06/21 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
java调用Restful接口的三种方法
2021/08/23 Java/Android
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技