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安全配置
Oct 09 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
Dec 21 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
php发送邮件的问题详解
Jun 22 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
Nov 21 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 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
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
PHP parse_url 一个好用的函数
2009/10/03 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
php检查页面是否被百度收录
2015/10/28 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
javascript从image转换为base64位编码的String
2014/07/29 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
微信小程序3D轮播实现代码
2019/09/19 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
全面了解python字符串和字典
2016/07/07 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
小学家长会邀请函
2014/01/23 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
2014年度培训工作总结
2014/11/27 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
放假通知范文
2015/04/14 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书