利用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 页面编码声明方法详解(header或meta)
Mar 12 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 PHP
php实现每天自动变换随机问候语的方法
May 12 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 PHP
php redis setnx分布式锁简单原理解析
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
一个MYSQL操作类
2006/11/16 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
asp 的 分词实现代码
2007/05/24 Javascript
定义select的边框颜色
2008/04/28 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
python动态网页批量爬取
2016/02/14 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
大学生思想汇报范文
2013/12/31 职场文书
预备党员思想汇报
2014/01/08 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
Python基础之进程详解
2021/05/21 Python
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
Python pyecharts绘制条形图详解
2022/04/02 Python