ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例


Posted in PHP onJuly 22, 2014

本文所述实例是使用在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数据的
此处注意:ExcelToArrary类建在根目录下的 addons /services/ExcelToArrary.class.php中

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本站下载地址https://3water.com/codes/194070.html

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
默默小谈PHP&amp;MYSQL分页原理及实现
Jan 02 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
php 中文和编码判断代码
May 16 PHP
PHP四大安全策略
Mar 12 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
PHP中Socket连接及读写数据超时问题分析
Jul 19 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
解决php写入数据库乱码的问题
Sep 17 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 #PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 #PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 #PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 #PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 #PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 #PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 #PHP
You might like
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
一些技巧性实用js代码小结
2009/10/14 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python逆序打印各位数字的方法
2018/06/25 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python flask搭建web应用教程
2019/11/19 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
虚拟机下载python是否需要联网
2020/07/27 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
初中化学教学反思
2014/01/23 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
2015新员工工作总结范文
2015/10/15 职场文书