利用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中取得image按钮传递的name值
Oct 09 PHP
真正的ZIP文件操作类(php)
Jul 21 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
php编写的简单页面跳转功能实现代码
Nov 27 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
Apr 08 PHP
php生成短网址示例
May 05 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
Feb 26 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
自动分页的不完整解决方案
2007/01/12 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
JS实现的车标图片提示效果代码
2015/10/10 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Python制作简单的网页爬虫
2015/11/22 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
PyQt5实现登录页面
2020/05/30 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
问卷调查计划书
2014/01/10 职场文书
品牌推广策划方案
2014/05/28 职场文书
物业保安岗位职责
2014/07/02 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Java Redisson多策略注解限流
2022/09/23 Java/Android