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 相关文章推荐
MySQL GBK→UTF-8编码转换
May 24 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
PHP操作xml代码
Jun 17 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 PHP
基于PHP实现的多元线性回归模拟曲线算法
Jan 30 PHP
PHP JWT初识及其简单示例
Oct 10 PHP
PHP实现的用户注册表单验证功能简单示例
Feb 25 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
XAMPP安装与使用方法详细解析
2013/11/27 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
基于jquery的滑动样例代码
2010/11/20 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
vue实现拖拽效果
2019/12/23 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python解析json实例方法
2013/11/19 Python
Python入门篇之条件、循环
2014/10/17 Python
Python MD5加密实例详解
2017/08/02 Python
python reduce 函数使用详解
2017/12/05 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
新闻编辑自荐信
2013/11/03 职场文书
农村党支部先进事迹
2014/01/14 职场文书
学生操行评语大全
2014/04/24 职场文书
入党积极分子考察意见
2015/06/02 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
《比的意义》教学反思
2016/02/18 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
Python一行代码实现自动发邮件功能
2021/05/30 Python