• 解决TP6使用PHPExcel导出excel文件时报错


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

     你是不是也遇到过这种情况?

    原因是什么?

    很简单,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文件复制到项目合适的路径下。

    文件目录是这样的:

    二:写公共导出方法:

    1. /**
    2. * 导出Excel
    3. * @param string $fileName 文件名称
    4. * @param array $headArr Excel标题头数组
    5. * @param array $data 数据内容
    6. * @param array $cellName Excel标题字母
    7. * @param string $suffix 文件后缀,xlsx 和 xls
    8. * @return bool
    9. */
    10. function exportExcel($fileName = "myData", $headArr = [], $data = [],$cellName, $suffix = 'xls'){
    11. @ini_set('memory_limit', '2048M');
    12. @set_time_limit(0);
    13. if (!$headArr || !$data || !is_array($data)) {
    14. return false;
    15. }
    16. require_once( CMF_ROOT."sdk/phpoffice/autoload.php");
    17. $fileName .= "_" . date("YmdHis");// 文件名称连接上相应的时间戳
    18. $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
    19. $sheet = $spreadsheet->getActiveSheet();
    20. $cellNum = count($headArr);
    21. $dataNum = count($data);
    22. for($i=0;$i<$cellNum;$i++){
    23. $sheet->setCellValue($cellName[$i].'1', $headArr[$i][1]);
    24. }
    25. for($i=0;$i<$dataNum;$i++){
    26. for($j=0;$j<$cellNum;$j++){
    27. $sheet->setCellValue($cellName[$j].($i+2), filterEmoji( $data[$i][$headArr[$j][0]] ) );
    28. }
    29. }
    30. // 重命名表(UTF8编码不需要这一步)
    31. $fileName = iconv("utf-8", "gbk//IGNORE", $fileName);
    32. // 清理缓存
    33. ob_end_clean();
    34. if ($suffix == 'xlsx') {
    35. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    36. $class = "\PhpOffice\PhpSpreadsheet\Writer\Xlsx";
    37. } elseif ($suffix == 'xls') {
    38. header('Content-Type:application/vnd.ms-excel');
    39. $class = "\PhpOffice\PhpSpreadsheet\Writer\Xls";
    40. }
    41. header('Content-Disposition: attachment;filename="' . $fileName . '.' . $suffix . '"');
    42. header('Cache-Control: max-age=0');
    43. $writer = new $class($spreadsheet);
    44. $writer->save('php://output');
    45. // 删除清空 释放内存
    46. $spreadsheet->disconnectWorksheets();
    47. unset($spreadsheet);
    48. }

    三:调用导出方法:【可以根据自己实际项目需要更换字段多少和字段名称,但请求Excel导出时的数据格式不要变】

    1. $xlsName = "充值记录";
    2. $xlsData=Db::name("charge_user")
    3. ->field('id,uid,money,coin,coin_give,orderno,type,trade_no,status,addtime')
    4. ->where($map)
    5. ->order('id desc')
    6. ->select()
    7. ->toArray();
    8. if(empty($xlsData)){
    9. $this->error("数据为空");
    10. }
    11. foreach ($xlsData as $k => $v) {
    12. $userinfo=getUserInfo($v['uid']);
    13. $xlsData[$k]['user_nickname']= $userinfo['user_nickname']."(".$v['uid'].")";
    14. $xlsData[$k]['addtime']=date("Y-m-d H:i:s",$v['addtime']);
    15. $xlsData[$k]['type']=$this->getTypes($v['type']);
    16. $xlsData[$k]['status']=$this->getStatus($v['status']);
    17. }
    18. $cellName = array('A','B','C','D','E','F','G','H','I','J');
    19. $xlsCell = array(
    20. array('id','序号'),
    21. array('user_nickname','会员'),
    22. array('money','人民币金额'),
    23. array('coin','兑换点数'),
    24. array('coin_give','赠送点数'),
    25. array('orderno','商户订单号'),
    26. array('type','支付类型'),
    27. array('trade_no','第三方支付订单号'),
    28. array('status','订单状态'),
    29. array('addtime','提交时间')
    30. );
    31. exportExcel($xlsName,$xlsCell,$xlsData,$cellName);

    四:导出效果:

    导出方法想要扩展代码的话,可以参考下面的链接:

    PhpSpreadsheet中文文档 | 基础Spreadsheet开发使用示例 - 互联网笔记

    使用 phpSpreadsheet 导出 Excel 完美支持超出26列 和 使用php原生导出 CSV 格式_李某人y的博客-CSDN博客_phpspreadsheet导出csv

    详解PhpSpreadsheet设置单元格_wbj16116的博客-CSDN博客

  • 相关阅读:
    给新手教师的成长建议
    【Leetcode】1362. Closest Divisors(配数学证明)
    win10怎么安装.net framework 3.5?
    Exploit Pack 漏洞利用工具包
    利用XtraDiagram.DiagramControl进行流程图形的绘制和控制
    金仓数据库 KingbaseES 插件ftutilx
    OpenCV + sklearnSVM 实现手写数字分割和识别
    unity3d著名项目-Dark Tree翻译
    Java实现敏感日志脱敏
    SpringBoot整合Sharing-JDBC按年月实现分表操作
  • 原文地址:https://blog.csdn.net/salestina/article/details/126441761