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 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
zend framework多模块多布局配置
Feb 26 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
Jul 08 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
PHP的拦截器实例分析
Nov 03 PHP
分享3个php获取日历的函数
Sep 25 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
学生逃课检讨书
2015/02/17 职场文书
工商局调档介绍信
2015/10/22 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
python中如何对多变量连续赋值
2021/06/03 Python
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers