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学习之流程控制实现代码
Jun 09 PHP
PHP源代码数组统计count分析
Aug 02 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
yii框架builder、update、delete使用方法
Apr 30 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
PHP中str_split()函数的用法讲解
Apr 11 PHP
php7中停止php-fpm服务的方法详解
May 09 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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
jquery改变tr背景色的示例代码
2013/12/28 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
Python中字典和集合学习小结
2017/07/07 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
欢迎标语大全
2014/06/21 职场文书
身边的榜样活动方案
2014/08/20 职场文书
租车协议书
2015/01/27 职场文书
2015年话务员工作总结
2015/04/29 职场文书
机关工会工作总结2015
2015/05/26 职场文书
感恩主题班会教案
2015/08/12 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript