PHPEXCEL在thinkphp中封装成类使用

标签: phpexcel导出导入thinkphp
-- : 435人阅读 评论() 收藏 举报
分类: php()
版权声明:本文为博主原创文章,未经博主允许不得转载。 phpexcel是一个强大的导入导出数据到excel表的插件类功能。本人在实际的项目开发中,会经常用到,下面为了以后方便使用,现将它封装成类。以下是在tp3.2的框架上使用。 ()去phpexcel的官网下载phpexcel。 ()在tp的核心库的第三库类vendor文件夹中新建一个excel的文件夹(自己定义合适文件夹名称就可以了),把下载的phpexcel文件夹和PHPExcel.php放在excel文件下。 ()tp配置文件连接数据库就不说了 导出类:ArrayToExcel.class.php [html] view plain copy print?在CODE上查看代码片派生到我的代码片
<?php
/**
*导出excel表
*
*/
class ArraryToExcel{
/**
*@param data mysql中查询的二维数组数据
*@param path PHPExcel的目录路径
*@param colAttr 列属性
*@param rowAttr 行属性
*@param options 属性选项
*@param excelObj PHPExcel的对象
*@param valiData 列的有效性数据
*/
private $data;
private $path;
private $excelObj;
private $colAttr=array(
'A'=>array(//列的属性设置
'colName'=>'',//第一行的列名
'keyName'=>'',//每一列对应的赋值数组的key值
'width'=>'' //A列的宽度
),
//可以以 A B C D E F ....递增
/* 'B'=>array(//列的属性设置
'colName'=>'',//第一行的列名
'keyName'=>'',//每一列对应的赋值数组的key值
'width'=>'' //B列的宽度
),
'C'=>array(//列的属性设置
'colName'=>'',//第一行的列名
'keyName'=>'',//每一列对应的赋值数组的key值
'width'=>'' //C列的宽度
),
'D'=>array(//列的属性设置
'colName'=>'',//第一行的列名
'keyName'=>'',//每一列对应的赋值数组的key值
'width'=>'' //D列的宽
)
*/
);
private $rowAttr=array(
'firstRowHeight'=>'', //第一行的列名的高度
'height'=>'' //2-OO无从行的高度
);
private $options=array(
'excelname'=>'导出excel', //导出的excel的文件的名称
'sheettitle'=>'sheet1', //每个工作薄的标题
'creater'=>'', //创建者,
'lastmodified'=>'', //最近修改时间
'title'=>'office xls document',//当前活动的主题
'subject'=>'office xls document',
'description'=>'数据导出',
'keywords'=>'数据导出',
'category'=>''
);
private $validData=array(); /**
*创建实例自动执行函数
*/
public function __construct($data,$colAttr,$rowAttr,$options,$validData){
/**
*导入文件的位置一定要准确,本人是把放在Vendor下,先在Vendor下建一个excel文件夹
*把下载的PHPExcel文件夹和PHPExcel.php放在excel下.
*/
$this->path=trim($path).'.';
Vendor($this->path.'PHPExcel')
$this->excelObj=new \PHPExcel();
$this->data=$data;
$this->colAttr=array_merge($this->colAttr,$colAttr);
$this->rowAttr=array_merge($this->rowAttr,$rowAttr);
$this->options=array_merge($this->options,$options);
$this->validData=array_merge($this->validData,$validData); }
/**
* @param data 从数据库取出来的数组
* @param excelname 下载保存的文件名称
* @param sheettitle 脚本的表名称
* @param creater 创作者
*
*/
//设置要注意顺序,先把各种的格式设置好,最后才存入值
//设置属性
public function push(){
$objPHPExcel=$this->excelObj;
$objPHPExcel->getProperties()
->setCreator($this->options['creater'])
->setLastModifiedBy($this->options['lastmodified'])
->setTitle($title)
->setSubject($this->options['subject'])
->setDescription($this->options['description'])
->setKeywords($this->options['keywords'])
->setCategory($this->options['category']); //设置sheet的name
$objPHPExcel->getActiveSheet()->setTitle($this->options['sheettitle']); //设置为excel的第一个表
// $objPHPExcel->setActiveSheetIndex(0);
//循环设置样色
foreach($this->colAttr as $key=>$val){
//设置每一列的字体居中显示,必须要同时设置水平居中和垂直居中
$objPHPExcel->getActiveSheet()
->getStyle($key)
->getAlignment()
->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()
->getStyle($key)
->getAlignment()
->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //设置第一行列名字段
$objPHPExcel->getActiveSheet()->setCellValue($key.'',$val['colName']); //设置列宽
if(isset($val['width'])&&!empty($val['width'])){
$objPHPExcel->getActiveSheet()->getColumnDimension($key)->setWidth($val['width']);
}else{
//自动根据字体的长度确定
$objPHPExcel->getActiveSheet()->getColumnDimension($key)->setAutoSize(true);
} }
//设置第一行高度
if(isset($this->rowAttr['firstRowHeight'])&&!empty($this->rowAttr['firstRowHeight'])){
$objPHPExcel->getActiveSheet()->getRowDimension()->setRowHeight($this->rowAttr['firstRowHeight']);
} //循环数组赋值excel单元格
foreach($this->data as $p=>$v){
//行数num,第二行开始
$row=$p+; // 设置数据的有效性
if(isset($this->validData)&&!empty($this->validData)) {
// 总分数据有效性下拉菜单
$objValidation1=$objPHPExcel->getActiveSheet()->getCell($this->validData['list1'][].$row)->getDataValidation();
$objValidation1->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST);
$objValidation1->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION);
$objValidation1->setAllowBlank(false);
$objValidation1->setShowInputMessage(true);
$objValidation1->setShowErrorMessage(true);
$objValidation1->setShowDropDown(true);
// $objValidation1->setErrorTitle('Input error');
// $objValidation1->setError('Value is not in list.');
// $objValidation1->setPromptTitle('Pick from list');
// $objValidation1->setPrompt('Please pick a value from the drop-down list.');
$objValidation1->setFormula1('"' . $this->validData['list1'][] . '"');
$objPHPExcel->getActiveSheet()->getCell('F'.$row)->setDataValidation($objValidation1); // 学期数据有效性下拉菜单
$objValidation2=$objPHPExcel->getActiveSheet()->getCell($this->validData['list2'][].$row)->getDataValidation();
$objValidation2->setType(\PHPExcel_Cell_DataValidation::TYPE_LIST);
$objValidation2->setErrorStyle(\PHPExcel_Cell_DataValidation::STYLE_INFORMATION);
$objValidation2->setAllowBlank(false);
$objValidation2->setShowInputMessage(true);
$objValidation2->setShowErrorMessage(true);
$objValidation2->setShowDropDown(true);
// $objValidation2->setErrorTitle('Input error');
// $objValidation2->setError('Value is not in list.');
// $objValidation2->setPromptTitle('Pick from list');
// $objValidation2->setPrompt('Please pick a value from the drop-down list.');
$objValidation2->setFormula1('"' . $this->validData['list2'][] . '"');
$objPHPExcel->getActiveSheet()->getCell('G'.$row)->setDataValidation($objValidation2); } foreach($this->colAttr as $k=>$vo){
/**
*Excel的第A列,uid是你查出数组的键值,下面以此类推
*将数组的值赋值excel的单元格
*/
$objPHPExcel->getActiveSheet()->setCellValue($k.$row, $v[$vo["keyName"]]);
} /**
*设置行高
*/
if(isset($this->rowAttr['height'])&&!empty($this->rowAttr['height'])){
$objPHPExcel->getActiveSheet()->getRowDimension($row)->setRowHeight($this->rowAttr['height']);
}
} ob_end_clean(); //清除缓冲区,避免乱码
ob_start(); // Added by me
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$this->options['excelname'].'.xls"');
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
$objWriter->save('php://output');
exit;
}
}
?> 导入类:ExcelToArrary.class.php [html] view plain copy print?在CODE上查看代码片派生到我的代码片
<?php
class ExcelToArrary {
/**
*@param path string //vendor下的存放phpexcel文件的路径
*@param filename string //上传后的excel文件的文件名
*@param ext string //文件格式后缀名
*@param $excelData array //读取excel表数据存放在数组
*/
private $path;
private $filename;
private $ext;
private $excelData=array(); /**
*实例化执行构造函数
*/
public function __construct($path,$filename){
/*导入phpExcel核心类 注意 :你的路径跟我不一样就不能直接复制
*导入文件的位置一定要准确,本人是把放在Vendor下,先在Vendor下建一个excel文件夹
把下载的PHPExcel文件夹和PHPExcel.php放在excel下
*/
$this->path=trim($path,'/');
$this->filename=$filename;
$this->ext=$this->getExt(); //引入phpexcel类(注意你自己的路径)
Vendor($this->path.".PHPExcel");
Vendor($this->path.".PHPExcel.IOFactory");
Vendor($this->path.".PHPExcel.Reader.Excel5");
Vendor($this->path.".PHPExcel.Reader.Excel2007");
} /**
*获取文件后缀名称
*/
private function getExt(){
return end(explode('.', $this->filename));
}
/*
@$filename 文件上传的路径名称,包括到文件格式
@$file_type 类型
*/
public function read(){
if(strtolower($this->ext)=='xls')//判断excel表类型为2003还是2007
{
$objReader = \PHPExcel_IOFactory::createReader('Excel5');
}elseif(strtolower($this->ext)=='xlsx')
{
$objReader = \PHPExcel_IOFactory::createReader('Excel2007');
}
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($this->filename);
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow();
$highestColumn = $objWorksheet->getHighestColumn();
$highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn); //由于excel的第一行是字段,所以我们真正的数据实际第二行开始导入数组的。
for($row = ; $row <= $highestRow; $row++) {
for ($col = ; $col < $highestColumnIndex; $col++) {
$this->excelData[$row-][] = (string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
}
}
//清空缓存
$objPHPExcel->disconnectWorksheets();
//删除变量
unset($objReader, $objPHPExcel, $objWorksheet, $highestColumnIndex);
return $this->excelData;
}
}
?> 将ExcelToArrary.class.php 类放在vendor的新建文件夹excel下(你自己所见的文件夹下)。 在控制器中的操作方法:export [html] view plain copy print?在CODE上查看代码片派生到我的代码片
<?php
namespace Home\Controller;
use Think\Controller;
class PhpexcelController extends Controller{ public function index(){
$this->display();
}
//导入excel表
public function import_execl(){
$upload = new \Think\Upload(); // 实例化上传类
$upload->maxSize = ; // 设置附件上传大小
$upload->exts = array('xls');// 设置附件上传类型
$upload->rootPath = $_SERVER["DOCUMENT_ROOT"].'/lianxi/tp/Public/'; // 设置附件上传目录
$info = $upload->upload();
if(!$info){
// 上传错误提示错误信息
$this->error($upload->getError()); }else{
// 上传成功
$filename=$upload->rootPath.$info['file_stu']['savepath'].$info['file_stu']['savename'];
$path='excel';
Vendor('excel.ExcelToArrary');
$ExcelToArrary=new \ExcelToArrary($path,$filename);
//读取返回来的数组
$res=$ExcelToArrary->read();
var_dump($res);
//循环
foreach ( $res as $k => $v ){
//addAll方法要求数组必须有0索引
$data[$k]['id'] = $v[];//创建二维数组
$data[$k]['classname'] = $v[];
$data[$k]['classaddr'] = $v[];
$data[$k]['starttime'] = $v[];
}
$userobj=M('user');//M方法
$myid=$userobj->where('id>=1')->delete();
$result=$userobj->addAll($data);
if(!$result){
$this->error('导入数据库失败');
exit();
}else{
$this->success ( '导入成功' );
} }
} //将数据导出excel表
public function exportToexcel(){
/**
*mysql的字段名称id,classname,classaddr,starttime
*
*/
$m=M('user');
//查询的数据
$data=$m->where('id>=1')->select();
/**
*vendor下的新建的文件夹excel,excel包含下载的PHPExcel文件夹和PHPExcel.php
*
*/
$path='excel';
//高属性参数
$colAttr=array(
//根据自己到处数据的实际情况添加列名
'A'=>array(//列的属性设置
'colName'=>'编号id',//第一行的列名
'keyName'=>'id',//每一列对应的赋值数组的key值
'width'=>'', //每一列的宽度
),
'B'=>array(//列的属性设置
'colName'=>'课程名称',//第一行的列名
'keyName'=>'classname',//每一列对应的赋值数组的key值
'width'=>'' //每一列的宽度
),
'C'=>array(//列的属性设置
'colName'=>'教室地点',//第一行的列名
'keyName'=>'classaddr',//每一列对应的赋值数组的key值
'width'=>'' //每一列的宽度
),
'D'=>array(//列的属性设置
'colName'=>'日期',//第一行的列名
'keyName'=>'starttime',//每一列对应的赋值数组的key值
'width'=>'' //每一列的宽度
)
);
//行属性参数
$rowAttr=array(
'firstRowHeight'=>'', //第一行的列名的高度
'height'=>'' //2-OO无从行的高度
);
//excel表的属性参数
$options=array(
'excelname'=>'用户数据', //导出的excel的文件的名称
'sheettitle'=>'高一1班', //每个工作薄的标题
); Vendor('excel.ArraryToExcel');
$ArraryToExcel=new \ArraryToExcel($data,$path,$colAttr,$rowAttr,$options);
$ArraryToExcel->push();
}
} ?>
这样子就可以将数据导出和导入至excel表

PHPEXCEL在thinkphp中封装成类使用的更多相关文章

  1. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  2. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  3. PHP连接数据库:封装成类

    php连接数据库,操作他增删改查等操作,其中要多次连接数据库,每个页面也需要连接数据库,更改数据会及其麻烦: 为了便于数据库的更改,我们可以把固定的那几句话封装成类,这样虽然代码量也差不多,但是有利于 ...

  4. python 日志的配置,python对日志封装成类,日志的调用

    # python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...

  5. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-读取json封装成类(13)

    把读取json数据的函数封装成类 # -*- coding: utf-8 -*- # @Time : 2020/2/12 16:44 # @File : do_json_13.py # @Author ...

  6. 易宝支付Demo,生产中封装成简洁的代付接口,不用request如何获取项目运行时的真实路径

    最近项目在做融360引流,涉及到了易宝支付的代扣和代付.易宝官方给出的demo只能简单运行,而且都是通过form表单的形式提交,返回XML格式.同时接口代码都写在了JSP中看起来不友好.项目在生成中想 ...

  7. 将Ajax 中数组转换成字符串 封装成类

    <?php class Ajax{ //ajax调用的方法 //sql是要执行的语句 //$type是SQL语句的类型,0代表增删改,1代表查询 //$db代表要操作的数据 public fun ...

  8. JavaScript封装成类

    JavaScript在WEB编程中能起到很大的作用,将一些常用的功能写成JavaScript类库. 将下面代码保存为Common.js 类库功能: 1.Trim(str)--去除字符串两边的空格 2. ...

  9. ThinkPHP中使用Verify类生产验证码不显示的原因

    今天在做网站部署的时候,发现登录页面的验证码显示不出来了,而且不报任何错误. 直接通过url访问该操作也不能显示. 后来在网上查找了一些解决方法. 在调用$verify = new \Think\Ve ...

随机推荐

  1. 万里长征第二步——django个人博客(第五步 ——配置后台admin)

    在urls.py文件中配置admin路径 from django.conf.urls import url from django.contrib import admin from blog.vie ...

  2. OSC的原理

    OSC是Online Schema Change简写,即在线架构改变.其实现步骤: 1. init,即初始化阶段,会对创建的表做一些验证工作,如检查表是否有主键,是否存在触发器或者外键等.2. cre ...

  3. 解决在win系统下使用DOS命令开启TensorBoard的问题及方法步骤

    解决在win系统下使用DOS命令开启TensorBoard的问题及方法步骤: TensorBoard是TensorFlow下的一个可视化的工具,能够帮助研究者们可视化训练大规模神经网络过程中出现的复杂 ...

  4. 模糊搜索:concat各种函数详解、like操作符、通配符

    if(StringUtils.isNotBlank(queryBean.getConditions())){ hqlBuilder.addWhereClause(" concat(this. ...

  5. C#-遍历datatable的几种方法

    遍历datatable的方法2009-- :02方法一: DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count ; i++) { string ...

  6. 【笔记】探索js 的this 对象 (第一部分)

    最近在看 你不知道的javascript 这本书,在第二部分看到了一个比较重要的知识点 那就是 this对象的全面认识,于是做一下笔记 博主本人在看这本书之前也一直以为 this 是指一切引用类型的本 ...

  7. Mybatis 一个搜索框对多个字段进行模糊查询

    <select id="list" parameterType="ParamConfigCondition" resultType="Param ...

  8. Android - Animation(二)

    Android - Animation(一) 一文总结了Android中的补间动画(View Animation/Tween Animation)和帧动画(Drawable Animation/Fra ...

  9. Jconsole

    Jconsole 1.1 简介以及连接 JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是Java自带的简单性能监控工具.下面以对tomcat的监控为例,带领大家熟悉Jcon ...

  10. mysql时间字段转换为毫秒格式

    下面是转载的关于MySQL毫秒.微秒精度时间处理的两段篇章,留给自己和供大家参考~~ 一.MySQL 获得毫秒.微秒及对毫秒.微秒的处理 MySQL 较新的版本中(MySQL 6.0.5),也还没有产 ...