先来看操作步骤和展示结果:


你是不是也遇到过这种情况?
原因是什么?
很简单,TP6要求PHP版本不能低于7.4.0,但PHPExcel自7.2版本之后已经基本不适用了,所以,如果你网站使用的是7.2之前的版本,那么使用PHPExcel导出功能是没有问题的,但是,超过7.2的版本就会遇到这种问题。
很多人也通过搜索找了网上的一堆关于解决这个问题的办法:
有的说把PHPExcel库文件里的break注释掉的
有的说把Excel5改成Excel2007的……各种说法都有,
他们的说法我也都挨个的测试了,没有一个管用的。
通过各种求证资料和搜索,找到了一种办法,那就是替换PHPExcel,彻底更换新的sdk执行导出。那就是用phpSpreadsheet。
一:首先,下载sdk。
使用composer安装sdk
composer require phpoffice/phpspreadsheet
如果composer安装不成功的话,可以在本地新建个空文件夹,然后打开命令行窗口,使用composer下载到这个空文件夹里,然后再把sdk文件复制到项目合适的路径下。
文件目录是这样的:

二:写公共导出方法:
- /**
- * 导出Excel
- * @param string $fileName 文件名称
- * @param array $headArr Excel标题头数组
- * @param array $data 数据内容
- * @param array $cellName Excel标题字母
- * @param string $suffix 文件后缀,xlsx 和 xls
- * @return bool
- */
- function exportExcel($fileName = "myData", $headArr = [], $data = [],$cellName, $suffix = 'xls'){
-
- @ini_set('memory_limit', '2048M');
- @set_time_limit(0);
- if (!$headArr || !$data || !is_array($data)) {
- return false;
- }
-
- require_once( CMF_ROOT."sdk/phpoffice/autoload.php");
-
- $fileName .= "_" . date("YmdHis");// 文件名称连接上相应的时间戳
- $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
-
- $cellNum = count($headArr);
- $dataNum = count($data);
-
- for($i=0;$i<$cellNum;$i++){
- $sheet->setCellValue($cellName[$i].'1', $headArr[$i][1]);
- }
-
- for($i=0;$i<$dataNum;$i++){
- for($j=0;$j<$cellNum;$j++){
- $sheet->setCellValue($cellName[$j].($i+2), filterEmoji( $data[$i][$headArr[$j][0]] ) );
- }
- }
-
- // 重命名表(UTF8编码不需要这一步)
- $fileName = iconv("utf-8", "gbk//IGNORE", $fileName);
- // 清理缓存
- ob_end_clean();
-
- if ($suffix == 'xlsx') {
- header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
- $class = "\PhpOffice\PhpSpreadsheet\Writer\Xlsx";
- } elseif ($suffix == 'xls') {
- header('Content-Type:application/vnd.ms-excel');
- $class = "\PhpOffice\PhpSpreadsheet\Writer\Xls";
- }
- header('Content-Disposition: attachment;filename="' . $fileName . '.' . $suffix . '"');
- header('Cache-Control: max-age=0');
-
- $writer = new $class($spreadsheet);
- $writer->save('php://output');
- // 删除清空 释放内存
- $spreadsheet->disconnectWorksheets();
- unset($spreadsheet);
-
- }
三:调用导出方法:【可以根据自己实际项目需要更换字段多少和字段名称,但请求Excel导出时的数据格式不要变】
- $xlsName = "充值记录";
-
- $xlsData=Db::name("charge_user")
- ->field('id,uid,money,coin,coin_give,orderno,type,trade_no,status,addtime')
- ->where($map)
- ->order('id desc')
- ->select()
- ->toArray();
-
- if(empty($xlsData)){
- $this->error("数据为空");
- }
-
- foreach ($xlsData as $k => $v) {
- $userinfo=getUserInfo($v['uid']);
- $xlsData[$k]['user_nickname']= $userinfo['user_nickname']."(".$v['uid'].")";
- $xlsData[$k]['addtime']=date("Y-m-d H:i:s",$v['addtime']);
- $xlsData[$k]['type']=$this->getTypes($v['type']);
- $xlsData[$k]['status']=$this->getStatus($v['status']);
- }
-
-
- $cellName = array('A','B','C','D','E','F','G','H','I','J');
- $xlsCell = array(
- array('id','序号'),
- array('user_nickname','会员'),
- array('money','人民币金额'),
- array('coin','兑换点数'),
- array('coin_give','赠送点数'),
- array('orderno','商户订单号'),
- array('type','支付类型'),
- array('trade_no','第三方支付订单号'),
- array('status','订单状态'),
- array('addtime','提交时间')
- );
- exportExcel($xlsName,$xlsCell,$xlsData,$cellName);
四:导出效果:

导出方法想要扩展代码的话,可以参考下面的链接:
PhpSpreadsheet中文文档 | 基础Spreadsheet开发使用示例 - 互联网笔记
使用 phpSpreadsheet 导出 Excel 完美支持超出26列 和 使用php原生导出 CSV 格式_李某人y的博客-CSDN博客_phpspreadsheet导出csv