工作需要,也因为之前编写的一个导出CSV文件,竟然不支持生僻字(可能是编码问题),算是一个升级版吧。

函数优点:

  1. 参数简洁明了,基本一看就懂;
  2. 支持无限列,看了一些别人的代码没看到支持的;
  3. 满足基本导出需求,花式的还是得自行编写。

函数缺点:

  1. 不支持合并,样式调整等等;
  2. IO开销较大,foreach层级较多。其实吧,还是CSV快,但它也就只是快。

函数代码:

<?php/*** 导出Excel文件,支持列数无限大(20220111编写,推荐使用)* @param array $headArr  数据头* @param array $datas    导出数据* @param string $fileName 导出的文件名* @param null|int|string|array $untransNumCols 针对数字字符串(如订单号、身份证号)不转化科学计数设置,字段必须为$datas索引,包括:数字索引、文字索引。多个请设置为数组*/
function exportExcel($headArr, $datas, $fileName = 'info', $untransNumCols = null)
{set_time_limit(60);ini_set('memory_limit', -1);Yii::import('application.extensions.phpexcel.PHPExcel');$date = date("YmdHis");$fileName .= "_{$date}.xls";$objPHPExcel = new \PHPExcel();$headArr = array_chunk($headArr, 26);$headKey = ord("A");if (!is_null($untransNumCols) && in_array(gettype($untransNumCols), ['string','integer',])) {$untransNumCols = [$untransNumCols];}$untransNumCols = is_null($untransNumCols) ? [] : $untransNumCols;foreach ($headArr as $headkeys => $headvals) {$key = ord("A");if ($headkeys)$headChr = chr($headKey);foreach ($headvals as $v) {$colum = (isset($headChr) ? $headChr : '') . chr($key);$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);$key++;}if ($headkeys)$headKey++;unset($headArr[$headkeys]);}unset($key);$column = 2;$objActSheet = $objPHPExcel->getActiveSheet();foreach ($datas as $key => $rows) {$datasArr = array_chunk($rows, 26, true);$headSpan = ord("A");foreach ($datasArr as $datakeys => $datavals) {$span = ord("A");if ($datakeys)$spanChr = chr($headSpan);foreach ($datavals as $vcolumn => $value) {$j = (isset($spanChr) ? $spanChr : '') . chr($span);if (is_numeric($value) && !in_array($vcolumn, $untransNumCols)) {$valtype = \PHPExcel_Cell_DataType::TYPE_NUMERIC;} else {$valtype = \PHPExcel_Cell_DataType::TYPE_STRING;}$objActSheet->setCellValueExplicit($j . $column, $value, $valtype);$span++;}if ($datakeys)$headSpan++;}unset($headSpan, $span, $spanChr, $datas[$key]);$column++;}$fileName = iconv("utf-8", "gbk", $fileName);$objPHPExcel->setActiveSheetIndex(0);ob_end_clean();ob_start();header('Content-Type: application/vnd.ms-excel'); //定义输出的文件类型为excel文件header("Content-Disposition: attachment;filename=\"$fileName\""); //定义输出的文件名header('Cache-Control: max-age=0'); //强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');$objWriter->save('php://output'); //文件通过浏览器下载
}

调用示例:

<?php$headArr = ['座次','星宿名','绰号','姓名','字','原职业/出身','职位',
];
$datas = [0 => ['ID' => '1', 'name' => '天魁星', 'name2' => '及时雨', 'name3' => '宋江', 'name4' => '公明', 'org_post' => '济州郓城县押司', 'ls_post' => '总兵都头领'],1 => ['ID' => '2', 'name' => '天罡星', 'name2' => '玉麒麟', 'name3' => '卢俊义', 'name4' => '-', 'org_post' => '大名府员外', 'ls_post' => '总兵都头领'],2 => ['ID' => '3', 'name' => '天机星', 'name2' => '智多星', 'name3' => '吴用', 'name4' => '学究', 'org_post' => '门馆教授', 'ls_post' => '掌管机密军师'],3 => ['ID' => '4', 'name' => '天闲星', 'name2' => '入云龙', 'name3' => '公孙胜', 'name4' => '一清', 'org_post' => '蓟州道士', 'ls_post' => '掌管机密军师'],4 => ['ID' => '5', 'name' => '天勇星', 'name2' => '大刀', 'name3' => '关胜', 'name4' => '-', 'org_post' => '凌州蒲东县巡检', 'ls_post' => '马军五虎将-左军大将'],5 => ['ID' => '6', 'name' => '天雄星', 'name2' => '豹子头', 'name3' => '林冲', 'name4' => '-', 'org_post' => '八十万禁军教头', 'ls_post' => '马军五虎将-右军大将'],6 => ['ID' => '7', 'name' => '天猛星', 'name2' => '霹雳火', 'name3' => '秦明', 'name4' => '-', 'org_post' => '青州指挥司统制', 'ls_post' => '马军五虎将-先锋大将'],7 => ['ID' => '8', 'name' => '天威星', 'name2' => '双鞭', 'name3' => '呼延灼', 'name4' => '-', 'org_post' => '汝宁州都统制', 'ls_post' => '马军五虎将-合后大将'],8 => ['ID' => '9', 'name' => '天英星', 'name2' => '小李广', 'name3' => '花荣', 'name4' => '-', 'org_post' => '青州清风寨武知寨', 'ls_post' => '马军八虎骑兼先锋使'],9 => ['ID' => '10', 'name' => '天贵星', 'name2' => '小旋风', 'name3' => '柴进', 'name4' => '-', 'org_post' => '沧州横海郡地主', 'ls_post' => '掌管钱粮头领'],
];
exportExcel($headArr, $datas, '人员清单');

说明下,$datas可以有key(如直接数据库查询出来的Query),也可以无key(自行组装)。

PHPExcel下载链接:https://pan.baidu.com/s/1Jr6EBtwLr5zb4s7VZ6eQVA 提取码: 4dsg

本文章,不授权任何人转载!!!

使用PHPExcel类库编写一个快捷的导出函数相关推荐

  1. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个...

    2019独角兽企业重金招聘Python工程师标准>>> 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如"我ABC ...

  2. C语言基础课 编写程序之1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数2.编写一个函数fun(),函数功能是:判断一个整数是否既是5又是7的整倍数,若是,输出yes,不是,输出n

    1.编写一个判断素数的函数,并利用该函数输出100~200的所有素数 #include<stdio.h> #include<math.h> int fun(int n) {in ...

  3. 编写一个截取字符串的函数

    编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入" ...

  4. 编写一个判断素数的函数,在主函数输入一个整数时,输出是否素数的信息。

    原文地址为: 编写一个判断素数的函数,在主函数输入一个整数时,输出是否素数的信息. 代码: 1 #include<iostream> 2 #include<cmath> 3 u ...

  5. (C++)编写一个判别素数的函数,在主函数输入一个整数,输出是否为素数的信息

    (C++)编写一个判别素数的函数,在主函数输入一个整数,输出是否为素数的信息. #include<iostream> using namespace std; /* 编写一个判别素数的函数 ...

  6. c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...

    点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...

  7. 编写一个截取字符串的函数,输入为一个字符串和字节数, 输出为按字节截取的字符串。 但是要保证汉字不被截半个。

    题目: 编写一个截取字符串的函数,输入为一个字符串和字节数, 输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4, 应该截为"我AB",输入 ...

  8. matlab编写正整数阶乘函数,用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值....

    点击查看用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值.具体信息 答:编写一个matlab文件,求1到n的阶乘之和.其代码编写的目的,就是学会自定义 ...

  9. 编写一个能够排序的函数模板。_LeetCode刷题——9.给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合...

    难度(medium) 题目描述: 给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合.例如n=3,解集为:  "((()))", "(()())" ...

最新文章

  1. Flex,Fms3相关文章索引(2009-3-25更新)
  2. javascript模块化简介
  3. 【收藏】IDEA中MAVEN项目自动导入依赖的启动与取消
  4. 对话系统有哪些最新进展?这17篇EMNLP 2021论文给你答案
  5. 腾讯云实验之Linux 基础入门
  6. POJ 2348 Euclid's Game(博弈)题解
  7. 数字通信同步技术的matlab与fpga实现_数字通信电缆行业规模情况及趋势分析(附报告目录)...
  8. 关于TortoiseGit汉化包装了,但仍然是英文菜单的问题记录
  9. 如何用计算机截部分屏,电脑怎样截长屏_电脑如何长截屏截图-win7之家
  10. Rootkit 后门的利用
  11. d2550性能 服务器,长得像I3的ATOM终于诞生了,D2550 ITX小板性能实测
  12. 天大2021年秋学期考试《网页设计与制作》离线作业考核试题
  13. Java成员方法getinfo_Java Swagger.getInfo方法代码示例
  14. linux c: 静态库和动态库的生成和使用
  15. 【定时任务】SpringBoot多线程并发动态执行定时任务
  16. Vivado IP核之RAM Block Memery Generator
  17. js在线预览[word,xls,ppt]-联机查看 Office 文档
  18. 反函数法生成服从特定概率密度函数的随机数
  19. 基于区块链的去中心化身份技术有哪些应用前景?
  20. 零知识证明(zero-knowledge proof)

热门文章

  1. 一文读懂电源缓启动原理
  2. 波特率、比特、字、千字节、兆、G之间转换
  3. 重要信息:如何扫描和删除恶意病毒
  4. 64位系统魔兽服务器不兼容,win10系统64位系统无法玩魔兽的具体技巧
  5. tensorflow自定义op:梯度
  6. 2022长安杯赛后复现
  7. Spring Security Oauth2 认证流程
  8. 微软2011年4月最有价值专家(MVP)名单 51CTO十七位用户当选
  9. LeetCode 迷宫系列(0490, 0499, 0505)
  10. linux 模拟hba卡闪断,服务器HBA卡常见问题