热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于phpexcel的php导出excel类,附注释和调用方法-PHP源码

以前我们写过一个HP通过链式操作将数据输出excel(csv)格式,最近项目又要导出excel,由于项目中要导出excel的地方太多,因此写个类便于管理使用。
以前我们写过一个 HP通过链式操作将数据输出excel(csv)格式,最近项目又要导出excel,由于项目中要导出excel的地方太多,因此写个类便于管理使用。

以前我们写过一个PHP通过链式操作将数据输出excel(csv)格式,http://www.111cn.net/phper/php-cy/72796.htm,现在我们来学习写一个php基于phpexcel制作的导出excel类

代码如下
/*
*@使用方法。
*引入类库。
*$excel = news excelC();
*$excel->fileName = '文件名称';//设置文件名称,默认为时间戳
*$excel->format = '2007';//文件类型,默认为2007,其他为excel5
*$record = array(
'delKey'=>array('id','addTime','status'),//如果数据$data中有不需要显示的列,可以在此说明。删除不需要导出的键值
'sort' =>array(
'keyName'=>array('subjectName','flag'),//按keyName列排序,如果不存在则不排序。
//'reorder'=>'DESC',//排序方式,DESC为倒序,ASC为正序。如果keyName存在则排序keyName,如果不存在则按数组的键名排序,如果reorder不存在则不排序
),//排序 如果sort存在则排序,否则不排序,如果keyName存在则按设置排序,如果不存在则按字符排序,如果reorder不存在或为空或为DES则正序,等于DESC为倒序。
'excelStyle' =>array(
'setName'=>'Arial',//字体样式
'setSize'=>'12',//字体大小
),//表格全局样式
'title' =>array('tableName'=>'学科列表','center'=>true,'direction'=>'right','merge'=>'2','setSize'=>'30'),//标题,center垂直,direction为合并方向。right,left,up,down。 merge为合并几个单元格,setSize为字体大小
'data' =>array(
array('tableName'=>'科目名称','width'=>'30','setName'=>'宋体','setSize'=>'20','background'=>'red','textColor'=>'white','bold'=>true,'underline'=>true,'borderColor'=>'cyan','center'=>true,),
array('tableName'=>'学科','width'=>'50','center'=>true),//颜色表是:black,white,red,green,blue,yellow,magenta,cyan
),//表名称 tableName为名称,width为表格宽度,setName为字体样式,background为背景颜色,textColor为字体颜色,bold为加粗,underline为下划线,borderColor为边框颜色.
'merge' =>array(
//'flag'=>array('keyword'=>'初','direction'=>'right','merge'=>'2'),merge的键值为需要处理数据数组的键值,keyword为如果存在此关键字才执行其他样式操作,如果keyword不存在则执行所有键值为flag的单元格。
'all'=>array('width'=>'30','setName'=>'宋体','setSize'=>'20','background'=>'red','textColor'=>'white','bold'=>true,'underline'=>true,'borderColor'=>'cyan','center'=>true,),
),//
);//导出配置


*$excel->export($record,$data);//$record为导出配置,$data为数据库的数据,$data可以为数组,也可以为对象。
*
*
*
*/
$address = dirname(dirname(__FILE__)).'/PHPExcel';
include $address.'/PHPExcel.class.php';
include $address.'/PHPExcel/Writer/Excel2007.php';
include $address.'/PHPExcel/Writer/Excel5.php';
include $address.'/PHPExcel/IOFactory.php';

/****************************
*生成excel文档。
*/

class excelC {

public $format = '2007';//转换格式,默认为2007版本,其他版本,请输入不是2007的数字

public $fileName;//文件名称默认为时间戳。


private $objExcel;

private $letters;

public function __construct()
{
$this->fileName = time();

$this->fileTitle = '导出数据';

$this->objExcel = new PHPExcel();
$this->letters = $this->letter();
}


//导出excel的属性
private function attribute(){


$this->objExcel->getProperties()->setCreator("力达行有限公司");//创建人

$this->objExcel->getProperties()->setLastModifiedBy("力达行有限公司");//最后修改人

$this->objExcel->getProperties()->setTitle("导出数据");//标题

$this->objExcel->getProperties()->setSubject("导出数据");//题目

$this->objExcel->getProperties()->setDescription("数据导出");//描述

$this->objExcel->getProperties()->setKeywords("office 导出");//关键字

$this->objExcel->getProperties()->setCategory("excel");//种类
}



//设置表(如果只有一个sheet可以忽略该函数,将默认创建。)
private function sheet(){

$this->objExcel->setActiveSheetIndex(0);//设置当前的表

$this->objExcel->getActiveSheet()->setTitle('excel');//设置表名称。
}


/***************************
*导出excel
*@attr $record为表头及样式设置
*@attr $data为需要导出的数据
*/
public function export($record=array(),$data=array()){
if(!$data)return false;
if(!is_array($record))return false;//表样式及其他设置

//处理获取到的数据
$data = $this->maniData($record,$data);

//获取整体样式。
$this->excelData($record,$data);


//$this->objExcel->getActiveSheet()->setCellValue('A1', '季度');

$this->down();//导出下载
}


/*
*处理表格
*/
private function excelData(&$record,&$data){
$this->attribute();//设置属性
$this->sheet();//设置表
$this->whole($record);//设置整体样式
$this->tableHeader($record);//设置表格头。
$this->tableContent($record,$data);//设置表格
$this->excelTitle($record,2);//设置标题
}

/*
*设置表格整体样式
*/
private function whole(&$record){
if(!array_key_exists('excelStyle',$record))return false;

$excelStyle = $record['excelStyle'];

$default = $this->objExcel->getDefaultStyle();

if(array_key_exists('setName',$excelStyle))
$default->getFont()->setName($excelStyle['setName']);//设置字体样式

if(array_key_exists('setSize',$excelStyle))
$default->getFont()->setSize($excelStyle['setSize']);//设置字体大小
}

/*
*设置标题
*/
private function excelTitle($record,$num){
$titleL = $this->letters[0];
if(!array_key_exists('title',$record))return false;
$this->appOintStyle($titleL ,1,$record['title']);

}

/*
*设置表格头。
*/
private function tableHeader($record){
if(!array_key_exists('data',$record))return false;
$objExcel = $this->objExcel;
$letters = $this->letters;

if(!is_array($record['data']))return false;

$i = 0;
$hang = 2;
foreach($record['data'] as $k=>$v){

$this->appOintStyle($letters[$i],$hang,$v);

$i++;
}

}

private function setCellValue($letter,$data){

if(@$data)
$this->objExcel->getActiveSheet()->setCellValue($letter, $data);//填充值

return $this;
}

private function getColumnDimension($letter,$data){

if(@$data)
$this->objExcel->getActiveSheet()->getColumnDimension($letter)->setWidth($data);//设置宽度

return $this;
}

private function setName($letter,$data){

if(@$data)
$this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setName($data);//设置字体

return $this;
}

private function setSize($letter,$data){

if(@$data)
$this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setSize($data);//设置字体大小

return $this;
}

private function background($letter,$data){

if(@$data){
$this->objExcel->getActiveSheet()->getStyle($letter)->getFill()->getStartColor()->setARGB($this->backColor($data));
$this->objExcel->getActiveSheet()->getStyle($letter)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);//设置背景色样式,无样式将不显示背景色。
}

return $this;
}

private function textColor($letter,$data){

if(@$data){
$this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->getColor()->setARGB($data);//字体颜色
}

return $this;
}

private function setBold($letter,$data){

if(@$data){
$this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setBold(true);//加粗
}

return $this;
}

private function setUnderline($letter,$data){

if(@$data){
$this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);//下划线
}

return $this;
}

private function border($letter,$data){

if(@$data){
$styleThinBlackBorderOutline = array(
'borders' => array (
'outline' => array (
'style' => PHPExcel_Style_Border::BORDER_THIN, //设置border样式
'color' => array ('argb' => $data), //设置border颜色
),
),
);
$this->objExcel->getActiveSheet()->getStyle($letter)->applyFromArray($styleThinBlackBorderOutline);
}

return $this;
}

/*
*合并
*/
private function mergeCells($letters,$hang,$direction,$merge){

$merge = $merge-1;

if($merge > 0 && $direction){

//print_r($this->letters);
$l = array_flip($this->letters);
$ln = $l[$letters];

switch ($direction)
{
case 'left':
$signal = $this->letters[($ln-$merge)].$hang.':'.$letters.$hang;
break;
case 'right':
$signal = $letters.$hang.':'.$this->letters[($ln+$merge)].$hang;
break;
case 'up':
$signal = $letters.($hang-$merge).':'.$letters.$hang;
break;
case 'down':
$signal = $letters.$hang.':'.$letters.($hang+$merge);
break;
default:
$signal = '';
}

if($signal){
$this->objExcel->getActiveSheet()->mergeCells($signal);
}

}

return $this;
}

/*
*垂直居中
*/
private function setVertical($letter,$data){

if($data){
$this->objExcel->getActiveSheet()->getStyle($letter)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$this->objExcel->getActiveSheet()->getStyle($letter)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
}
return $this;

}









/*
*设置颜色
*/
private function backColor($color){

$array = array(
'black' => 'FF000000', // System Colour #1 - Black
'white' => 'FFFFFFFF', // System Colour #2 - White
'red' => 'FFFF0000', // System Colour #3 - Red
'green' => 'FF00FF00', // System Colour #4 - Green
'blue' => 'FF0000FF', // System Colour #5 - Blue
'yellow' => 'FFFFFF00', // System Colour #6 - Yellow
'magenta' => 'FFFF00FF', // System Colour #7- Magenta
'cyan' => 'FF00FFFF', // System Colour #8- Cyan
);
if(array_key_exists($color,$array)){
return $array[$color];
} else {
return false;
}

}
/*
*设置表
*/
private function tableContent(&$record,&$data){
$objExcel = $this->objExcel;
$letters = $this->letters;

if(array_key_exists('merge',$record))
$merge = $record['merge'];
else
$merge = '';

$hang = 2;
foreach($data as $k=>$v){
$i=0;
$hang++;

foreach($v as $kk=>$vv){
$this->setCellValue($letters[$i].$hang, $vv);//设置内容
$this->Appoint($kk,$vv,$letters[$i],$hang,$merge);
$i++;
}

}
}

/*
*设置表指定样式
*/
private function Appoint($kk,$vv,$letters,$hang,$merge){
if(!$merge)return false;
if(array_key_exists($kk,$merge)){
$v = $merge[$kk];
if(array_key_exists('keyword',$v)){

if(strpos($vv,$v['keyword']) > -1){
$this->appOintStyle($letters,$hang,$v);
}

} else {
$this->appOintStyle($letters,$hang,$v);
}
} else if(array_key_exists('all',$merge)){
$v = $merge['all'];
if(array_key_exists('keyword',$v)){

if(strpos($vv,$v['keyword']) > -1){
$this->appOintStyle($letters,$hang,$v);
}

} else {
$this->appOintStyle($letters,$hang,$v);
}
}
}

/*
*终极样式
*/
private function appOintStyle($letters,$hang,$v){

$this
->setCellValue($letters.$hang,@$v['tableName'])
->getColumnDimension($letters,@$v['width'])
->setName($letters.$hang,@$v['setName'])
->setSize($letters.$hang,@$v['setSize'])
->background($letters.$hang,@$v['background'])
->textColor($letters.$hang,$this->backColor(@$v['textColor']))
->setBold($letters.$hang,@$v['bold'])
->setUnderline($letters.$hang,@$v['underline'])
->border($letters.$hang,$this->backColor(@$v['borderColor']))
->mergeCells($letters,$hang,@$v['direction'],@$v['merge'])
->setVertical($letters.$hang,@$v['center']);
}

/*
*应为字母列表
*/
public function letter(){
return array('A','B','C','D','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','H','Y','Z');
}

/****************************
*处理数据,排序及删除字段
*/
private function maniData($record,$data){
if(!$data)return false;
if(!is_array($record))return false;//表样式及其他设置

$data = $this->objectToArray($data);//对象转数组

$delKey = (array_key_exists('delKey',$record))?$record['delKey']:'';//是否删除关键字
$sort = (array_key_exists('sort',$record))?$record['sort']:'';//是否排序
$data = $this->delSort($data,$delKey,$sort);
return $data;
}

/****************************
*对象转数组
*/
private function objectToArray($data){
if(!$data)return false;
$data = (array)$data;

foreach($data as $k=>$v){
if(is_object($v) || is_array($v)){
$data[$k] = (array)$this->objectToArray($v);
}
}
return $data;
}

/****************************
*删除键值,并排序
*/
private function delSort($data,$delKey='',$sort=''){

if(!$data)return false;

$array = array();
foreach($data as $k=>$v){

//删除数据中的某个键值
$delData = $this->delData($v,$delKey);
//按设定键值排序
$sortData = $this->sortData($delData,$sort);
$array[$k] = $sortData;
}

return $array;

}

/****************************
*删除键值
*/
public function delData($data,&$delKey){
if($delKey){
foreach($delKey as $delVal){
if(array_key_exists($delVal,$data))//判断键值是否存在
unset($data[$delVal]);//清除键名。
}
}
return $data;
}

/****************************
*键值排序
*/
public function sortData($data,&$sort){
$array = array();
if($sort){
if(array_key_exists('keyName',$sort)){
$keyName = $sort['keyName'];
if(array_key_exists('reorder',$sort)){
if($sort['reorder'] == 'DESC'){
krsort($keyName);
} else if($sort['reorder'] == 'ASC'){
ksort($keyName);
}
}
foreach($keyName as $vn){
$array[$vn] = (array_key_exists($vn,$data))?$data[$vn]:'';
}
} else {
if(array_key_exists('reorder',$sort)){
if($sort['reorder'] == 'DESC'){
krsort($data);
} else if($sort['reorder'] == 'ASC'){
ksort($data);
}
$array = $data;
}
}

}
return $array;
}



//导出下载
private function down(){

if($this->format == '2007'):
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$excel = 'Excel2007';
else:
header('Content-Type: application/vnd.ms-excel');
$excel = 'Excel5';
endif;

header("Content-Disposition: attachment; filename="$this->fileName"");
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($this->objExcel, $excel);

$objWriter->save('php://output');

}
}

推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
author-avatar
Belief
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有