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错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
PHP+jQuery 注册模块开发详解
Oct 14 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
PHP使用Pear发送邮件(Windows环境)
Jan 05 PHP
PHP常用的三种设计模式
Feb 17 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
PHP中的异常处理机制深入讲解
Nov 10 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
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
深入密码加salt原理的分析
2013/06/06 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
php cookie 详解使用实例
2016/11/03 PHP
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
js单例模式详解实例
2013/11/21 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
Python制作爬虫采集小说
2015/10/25 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python 读入多行数据的实例
2018/04/19 Python
python实现黑客字幕雨效果
2018/06/21 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
Python 中Operator模块的使用
2021/01/30 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
Yahoo的PHP面试题
2014/05/26 面试题
员工三分钟演讲稿
2014/08/19 职场文书
无罪辩护词范文
2015/05/21 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
用php如何解决大文件分片上传问题
2021/07/07 PHP
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers