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

news2025/8/9 13:05:13

一.普遍导出方法

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

但是这样会有两个问题:

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

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

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

二.使用通用的导出方法

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

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

显然,要实现此功能,最大的一个难题是,根据单条数据的索引和表头字段次序,自动计算出每条数据中的每个字段在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进制):

1

2

3

4

5

6

7

8

//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;

其他类似

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

//导出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);

}

三.导出结果示例

导出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外汇天眼:2022 年世界杯已经开始,但这将如何影响外汇交易?

关于 2022 年世界杯 2022年世界杯于2022年11月20日在卡塔尔拉开帷幕&#xff0c;将持续到2022年12月18日。2022年国际足联世界杯是由国际足联成员协会的男子国家队和第22届国际足联世界杯举办的国际足球锦标赛。这是第一次在阿拉伯世界举办的世界杯。 关于中东 尽管经历了疫情…

MCE | KRAS 突变型肺癌耐药性探索

KRAS 是一种致癌基因&#xff0c;编码 KRAS 蛋白 (一种 small GTPase 转导蛋白)。KRAS 通过结合 GTP/GDP 控制其活跃状态&#xff0c;进而控制其信号传递和下游级联反应。致癌性 KRAS 突变会破坏 GTPase 活性&#xff0c;进而使 KRAS 蛋白锁定在活跃状态下&#xff0c;从而使启…

【面试题】JS基础-异步

1. 异步 1.1 为什么要异步&#xff1f; JS是单线程语言&#xff0c;只能同时做一件事。JS和DOM渲染共用同一个线程&#xff0c;因为JS可修改DOM结构。当遇到等待的情况时&#xff0c;例如网络请求、定时任务&#xff0c;程序不能卡住。所以需要异步来解决JS单线程等待的问题&…

学完Spring框架回头再来看反射你会发现真的不一样

文章目录前言一.什么是反射&#xff1f;二.如何实现反射&#xff1f;2.1java.lang.Class2.2通过反射创建对象2.3通过反射获取类成员三.反射的性能四.反射是如何破坏单例模式的&#xff1f;五.如何避免单例模式被反射破坏&#xff1f;前言 你还记得你的Spring入门案例吗&#x…

查询利器—索引

目录 索引的优缺点 常见索引分类 MySQL数据操作的宏观过程 认识磁盘 正式理解索引结构 采用B树的原因 聚簇索引与非聚簇索引 索引操作 索引创建原则 索引的优缺点 优点&#xff1a;提高一个海量数据的检索速度 缺点&#xff1a;查询速度的提高是以插入、更新、删除…

pdf生成:wkhtmltopdf

wkhtmltopdf是开源&#xff08;LGPLv3&#xff09;命令行工具&#xff0c;使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。这些完全以“headless”模式运行&#xff0c;不需要显示或显示服务wkhtmltoimage。建议&#xff1a; 不要将wkhtmltopdf与任何不受信任的HTML一起…

sqli-labs/Less-61

这一关的欢迎界面提示我们尝试机会为5次 然后要以id为注入点 首先先判断一下是否为数字型 输入id1 and 12 回显如下 所以属于字符型 然后输入1 回显如下 出现了报错信息 说明可以进行报错注入 也说明了注入类型 佐证一下 输入一个1))--回显如下 这道题我还是使用报错注入 首…

使用Python查询国内 COVID-19 疫情

有时我们只是想要一个速的工具来告诉当前疫情的情况&#xff0c;我们只需要最少的数据。 使用Python语言和tkinter图形化显示数据。 首先&#xff0c;我们使用 Tkinter 库使我们的脚本可以图形化显示。 使用 requests 库从 丁香园 获取数据。 然后我们将在这种情况下显示我们…

c# .net+香橙派orangepi 200块多打造自家 浇花助手 系统

由于出差多&#xff0c;这里的花经常过一段时间才能浇水,有些花都旱晕了&#xff0c;所以想做一个助手帮我远程就可以操作浇花&#xff0c;当然也完全可以发展为一个商用系统&#xff0c;拿浇花来做为一个测试平台吧&#xff0c;现在已经完成了&#xff0c;并已经运行了一个多月…

异双功能连接体:Alkyne PEG4 APN,2183440-36-8

一、产品描述&#xff1a; APN-C3-PEG4-炔是一种含有APN部分的异双功能连接体&#xff0c;对半胱氨酸和炔基具有很强的化学选择性。APN半胱氨酸缀合物在水性介质、人血浆和活细胞中的优异稳定性使这种新的巯基点击反应成为生物缀合应用的一种有前景的方法。 APN-C3-PEG4 alkyne…

C语言:关键字----switch、case、default(开关语句)

C语言&#xff1a;基础开发----目录 C语言&#xff1a;关键字—32个(分类说明) 有32个关键字详细说明&#xff0c;还有跳转链接&#xff01; 一、开关语句----介绍 开关语句&#xff0c;包括以下四种关键字&#xff1a; switch&#xff1a;开关语句case&#xff1a; 开关语句…

PHP如何实现订单的延时处理详解

业务需求 订单是我们在日常开发中经常会遇到的一个功能&#xff0c;最近在做业务的时候需要实现客户下单之后订单超时未支付自动取消的功能&#xff0c;刚开始确认了几种方法&#xff1a; 客户端到时间请求取消服务端定时查询有没有需要取消的订单&#xff0c;然后批量处理下…

深度学习入门(五十)计算机视觉——转置卷积

深度学习入门&#xff08;五十&#xff09;计算机视觉——转置卷积前言计算机视觉——转置卷积课件&#xff08;初见转置卷积&#xff09;1 转置卷积2 为什么称之为“转置”课件&#xff08;再谈转置卷积&#xff09;1 转置卷积2 重新排列输入和核形状换算同反卷积的关系总结教…

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

经典回答 这应该是一道很虐人的面试题&#xff0c;很多人都答不上来&#xff0c;很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时&#xff0c;我找过一些同事讨论是否还有在面试中考查这个问题的必要&#xff0c;得到的回答是“程序员何苦为难程序员”…

网络面试题总结

IO协议 问题一:如何理解IP的不可靠和无连接 不可靠:指的是不能保证数据包能成功地到达目的地。发生错误的时候,丢弃该数据包,发送ICMP消息给信源端。可靠性由上层提供。无连接: :IP 不维护关于后续数据报的状态信息。 体现在,IP 数据可以不按顺序发送和接收。A 发送连续…

信息安全工程实践笔记--Day2 暴力破解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录实验目标一、弱口令分类1.系统服务弱口令2.设备弱口令3.社工型的弱口令二、弱口令的攻击方式暴力破解获取密码的方式三、bp实操1.bp模块讲解1.sniper&#xff08;狙击…

跨平台下移动应用的开发框架对比与分析

当前由于移动互联网技术的日益发展&#xff0c;人们对移动互联网程序的要求也是越来越高&#xff0c;以往的互联网程序已经不能满足人们日益增长的需求&#xff0c;对此相关的工作技术人员要不断努力&#xff0c;研发出与时俱进的移动互联网程序。 近些年来由于平板电脑、智能…

【HTML5】调查问卷制作简约版

当你第一次使用CSS时候 目录 1、调查问卷网页展示及源码 1.1html源码 1.2css源码 2、form表单属性的用法 2.1date属性 2.2radio属性 2.3checkbox属性 2.4textarea标签 2.5required属性 2.6button标签 前言&#xff1a; 大家好&#xff0c;我是拳击哥带你捶键盘。首先感…

是前端受欢迎,不是你学了前端你就受欢迎好吧

☆ 这几天世界杯真是爆冷啊&#xff0c;也许是这届世界杯是冬天举办的原因吧。 ☆ 昨晚的德国对日本&#xff0c;日本做为亚洲小组冲出的第一名&#xff0c;实力强没有问题。而且我从小就看《足球小子》&#xff0c;大空翼深入人心啊。还记得那个动画片&#xff0c;放了学赶紧回…

运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团

运营版uniapp多商户商城小程序H5APP商家入驻短视频社区种草直播阶梯拼团 前后端全套源码&#xff0c; 支持二次开发&#xff0c;代码无加密&#xff01; 独立商家后台 用于店铺商品管理订单管理发货管理等 多类经营模式 多商家B2B2C、自营B2C运营模式 私有化部署 前端Uni…