利用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 相关文章推荐
中英文字符串翻转函数
Dec 09 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php 文件上传类代码
Aug 06 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
php日期操作技巧小结
Jun 25 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
PHP+MySql实现一个简单的留言板
Jul 19 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
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
PHP+jQuery+Ajax实现多图片上传效果
2015/03/14 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
python获取文件扩展名的方法
2015/07/06 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python正则中最短匹配实现代码
2018/01/16 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
python 接收处理外带的参数方法
2018/12/03 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
饮料业务员岗位职责
2013/12/15 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
物业工作计划书
2014/01/10 职场文书
委托证明的格式
2014/01/10 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
个人委托函范文
2015/01/29 职场文书
董事长致辞
2015/07/29 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技