php中通用的excel导出方法实例


Posted in PHP onDecember 30, 2017

一.普遍导出方法

excel导出的方法网上有很多,在crm或是oa系统中导出excel是常有的事,做过的此功能人都知道,其主要操作其实是循环数据列表,然后一格一格地添加数据到固定的单元格中。只要做好了一次,其后只要复制相关代码修改修改,其他地方导出功能也就完成了。

但是这样会有两个问题:

     1.当列表数据字段修改时,需要修改大量的代码,维护艰难,改着难受;

     2.多次出现导出功能时,需要在多个地方复制大量的重复冗余代码,看着难受;

因此,有必要统一一个导出excel的方法,使用时,只需要传入数据的表头,表头字段名,数据列表,以及数据表名称,就能导出excel了。

二.使用通用的导出方法

如下图所示,只要传入4个参数,就能完成导出,使用和维护就变得简单多了。

php中通用的excel导出方法实例

好的,目标已经明确了,接下来就是代码实现了。

显然,要实现此功能,最大的一个难题是,根据单条数据的索引和表头字段次序,自动计算出每条数据中的每个字段在excel中的坐标值(如A1,B3)。

那么我们就来分析下excel的单元格坐标吧,从A1开始,纵向递增数字的值,横向递增字母,当横向字母变为Z后,下一个字母为AA,然后AB,...,ZZ,...,AAA...

这样的话,我们就知道了,纵向坐标简单,根据每条数据的索引值就可以计算得出,难的是横向坐标,该怎么计算?再仔细分析下横向坐标,可以发现是一种类似26进制的字母数字,A如果看作0,那Z表示25。但是这种数字与我们常见的16进制,8进制等又不太一样,因为当Z进位的时候,下一个数不是BA,而是AA。常见的进制中,如十进制9进位,变成10,而不是00;16进制0xF进位,变为0x10,而不是0x00。

因此可以参考进制转换的算法,然后变化一下,得出计算excel的横向坐标的方法(10进制转伪26进制):

//AAA转换
public static function toAAA($dec)
{
 if ($dec < 0) return '';
 $y = $dec % 26;
 $x = floor($dec / 26);
 return self::toAAA($x - 1) . chr($y + 65);
}

最后,附上完整代码

框架为Yii2,excel导出组件为moonlandsoft/yii2-phpexcel;

其他类似

//导出xls
public static function exportXls($array)
{
 set_time_limit(0);
 include(Url::to('@vendor/moonland/phpexcel/PHPExcel.php'));
 include(Url::to('@vendor/moonland/phpexcel/PHPExcel/Writer/Excel2007.php'));
 $titles = $array['titles'];
 $fields = $array['fields'];
 $list = $array['list'];
 $name = $array['name'];
 $count = count($titles);
 $keys = [];//A=>chr(65)
 foreach ($titles as $k => $v) {
 $keys[] = self::toAAA($k);
 }
 $objPHPExcel = new \PHPExcel();
 $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
 $objPHPExcel->setActiveSheetIndex(0);
 $activeSheet = $objPHPExcel->getActiveSheet();
 $activeSheet->setTitle($name);
 $activeSheet->getStyle("A1:{$keys[$count-1]}1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
 $activeSheet->mergeCells("A1:{$keys[$count-1]}1");
 $activeSheet->setCellValue('A1', $name);
 //设置title,样式
 foreach ($titles as $key => $title) {
 $activeSheet->setCellValue($keys[$key] . '2', $title);
 $activeSheet->getColumnDimension($keys[$key])->setWidth(20);
 $activeSheet->getRowDimension(($key + 1))->setRowHeight(18);
 }
 $i = 3;
 foreach ($list as &$item) {
 foreach ($keys as $k => $v) {
  $val = isset($item[$fields[$k]]) ? $item[$fields[$k]] . ' ' : ' ';
  $activeSheet->setCellValue($v . $i, $val);
 }
 $i++;
 }
 $fileName = $name . "_" . date('Y_m_d_His') . '.xlsx';
 header("Cache-Control: public");
 header("Pragma: public");
 header("Content-type:application/vnd.ms-excel");
 header("Content-Disposition:attachment;filename=" . iconv("utf-8", "GB2312//TRANSLIT", $fileName));
 header('Content-Type:APPLICATION/OCTET-STREAM');
 ob_clean();
 ob_start();
 $objWriter->save('php://output');
 ob_end_flush();
}
//AAA转换
public static function toAAA($dec)
{
 if ($dec < 0) return '';
 $y = $dec % 26;
 $x = floor($dec / 26);
 return self::toAAA($x - 1) . chr($y + 65);
}

三.导出结果示例

导出结果:

php中通用的excel导出方法实例

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
谈谈PHP语法(2)
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
PHP新手上路(三)
Oct 09 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
php微信公众平台开发类实例
Apr 01 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
Laravel实现autoload方法详解
May 07 PHP
php+redis实现消息队列功能示例
Sep 19 PHP
laravel withCount 统计关联数量的方法
Oct 10 PHP
PHP基本语法
Mar 31 PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 #PHP
PHP如何实现订单的延时处理详解
Dec 30 #PHP
PHP 的Opcache加速的使用方法
Dec 29 #PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 #PHP
PHP检测接口Traversable用法详解
Dec 29 #PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
Dec 28 #PHP
PHP迭代器接口Iterator用法分析
Dec 28 #PHP
You might like
用PHP制作静态网站的模板框架
2006/10/09 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
基于jquery的3d效果实现代码
2011/03/23 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
生产总经理岗位职责
2013/12/19 职场文书
企业宣传策划方案
2014/05/29 职场文书
销售人才自我评价范文
2014/09/27 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
单位租房协议书范本
2014/12/04 职场文书
苏州园林导游词
2015/02/03 职场文书
2015年维修工作总结
2015/04/25 职场文书
三国演义读书笔记
2015/06/25 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android