利用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 相关文章推荐
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
PHP校验ISBN码的函数代码
Jan 17 PHP
php简单浏览目录内容的实现代码
Jun 07 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
yii的CURD操作实例详解
Dec 04 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 PHP
如何运行/调试你的PHP代码
Oct 23 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
用PHP和ACCESS写聊天室(八)
2006/10/09 PHP
一个图形显示IP的PHP程序代码
2007/10/19 PHP
dedecms中使用php语句指南
2014/11/13 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Django如何自定义分页
2018/09/25 Python
python的turtle库使用详解
2019/05/10 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
九州传奇上机题
2014/07/10 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
营销与策划专业毕业生求职信
2013/11/01 职场文书
销售实习自我鉴定
2013/12/07 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
环保建议书200字
2014/05/14 职场文书
公司离职证明样本
2014/09/13 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
十八大标语口号
2014/10/09 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书