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 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
swfupload 多文件上传实现代码
Aug 27 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php校验表单检测字段是否为空的方法
Mar 20 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
php实现基于PDO的预处理示例
Mar 28 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
Laravel中Kafka的使用详解
Mar 24 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 stripslashes和addslashes的区别
2014/02/03 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python Django模板的使用方法
2016/01/14 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
django迁移数据库错误问题解决
2019/07/29 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
银行自荐信范文
2013/10/07 职场文书
中学生操行评语
2014/04/24 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
婚礼父母答谢词
2015/01/04 职场文书
最美乡村教师观后感
2015/06/11 职场文书
画展观后感
2015/06/17 职场文书
礼貌问候语大全
2015/11/10 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
springboot入门 之profile设置方式
2022/04/04 Java/Android