用PHPExcel 封装的导出方法,支持导出无限列

news2025/4/18 20:25:58

用PHPExcel 封装的导出方法,支持导出无限列
避免PHPExcel_Exception Invalid cell coordinate [1 异常错误

/**
     * EXCEL导出
     * @param [string] $file_name 保存的文件名及表格工作区名,不加excel后缀名
     * @param [array] $fields 二维数组
     * @param [array] $list 数据 
     * @param [array] $options e.g. [
     * 'download_items'=>[需要下载图片的字段项],
     * 'string_items'=>[转成字符避免科学计数法转换的字段], 
     * ]
     * @return [string]
     * @Description
     * @example
     * @author Tj
     * @date 2024-12-26
     */
    static public function exportExcelData(
        $file_name,
        $fields,
        $list,
        $options = [
            'download_items' => [],
            'string_items' => [],
        ]
    ) {
        ini_set("memory_limit", "128M");
        ini_set("max_execution_time",  "600");
        // 创建一个样式数组
        $styleArray = array(
            'borders' => array(
                'allborders' => array(
                    'style' => \PHPExcel_Style_Border::BORDER_THIN, // 边框样式
                    'color' => array('rgb' => '000000'), // 边框颜色
                ),
            ),
        );
        $objectPHPExcel = new \PHPExcel();
        $objectPHPExcel->setActiveSheetIndex(0);
        $objectPHPExcel->getActiveSheet()->setTitle($file_name);
        //设置表格头的输出
        $newFields = $fields;

        // 锁定表头
        $objectPHPExcel->getActiveSheet()->freezePane('A2');
        // 表头设置
        foreach ($newFields as $fkey => $fval) {
            if ($fval['selected'] == 1) {
                $excelColumnNumHeader = self::int_to_chr($fkey);
                $objectPHPExcel->setActiveSheetIndex()->setCellValue($excelColumnNumHeader . '1', $fval['value']);
                // 设置表头加粗
                $objectPHPExcel->getActiveSheet()->getStyle($excelColumnNumHeader . '1')->getFont()->setBold(true);
                // 边框
                $objectPHPExcel->getActiveSheet()->getStyle($excelColumnNumHeader . '1')->applyFromArray($styleArray);
                // 背景色
                $objectPHPExcel->getActiveSheet()->getStyle($excelColumnNumHeader . '1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
                $objectPHPExcel->getActiveSheet()->getStyle($excelColumnNumHeader . '1')->getFill()->getStartColor()->setARGB('E0EEE0');
                // 设置行高
                $objectPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(18);
            } else {
                unset($newFields[$fkey]);
            }
            // 画边框 
        }
        //订单数据
        $serviceFields = array_column($newFields, 'key');
        $coverPicArr = [];
        foreach ($list as $itemKey => $item) {
            foreach ($serviceFields as $sfKey => $sfVal) {
                $excelColumnNum = self::int_to_chr($sfKey); // A-ZZZ
                $excelRowNum = $itemKey + 2;
                // 文字垂直居中
                $objectPHPExcel->getActiveSheet()->getstyle($excelColumnNum . $excelRowNum)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
                // 画边框 
                $objectPHPExcel->getActiveSheet()->getStyle($excelColumnNum . $excelRowNum)->applyFromArray($styleArray);
                // 单元格宽
                $objectPHPExcel->getActiveSheet()->getColumnDimension($excelColumnNum)->setWidth(20);
                // 图片
                if (isset($options) && in_array($sfVal, $options['download_items'])) {
                    $local_temp_pic_prev = './temp/export/excel_pic/';
                    $pic_link = $item[$sfVal];
                    if (is_array($pic_link)) {
                        $pic_link = $pic_link[0];
                    }
                    $temp_pic = self::getFilename($pic_link);
                    $local_pic_path = $local_temp_pic_prev . $temp_pic;
                    if (!file_exists($local_pic_path)) {
                        $temp_pic = self::download($pic_link, $local_temp_pic_prev);
                        $local_pic_path = $local_temp_pic_prev . $temp_pic;
                    }
                    if (file_exists($local_pic_path)) {
                        $img = new \PHPExcel_Worksheet_Drawing();
                        $img->setPath($local_pic_path); //写入图片路径
                        $img->setHeight(100); //写入图片高度
                        $img->setWidth(100); //写入图片宽度
                        $img->setOffsetX(5); //写入图片在指定格中的X坐标值
                        $img->setOffsetY(5); //写入图片在指定格中的Y坐标值
                        $img->setRotation(0); //设置旋转角度
                        $img->getShadow()->setVisible(true);
                        $img->getShadow()->setDirection(50);
                        $img->setCoordinates($excelColumnNum . $excelRowNum); //设置图片所在表格位置
                        $img->setWorksheet($objectPHPExcel->getActiveSheet()); //把图片写到当前的表格中

                        $coverPicArr[] = $local_pic_path; //记录临时图片

                        //设置列宽
                        $objectPHPExcel->getActiveSheet()->getColumnDimension($excelColumnNum)->setWidth(16);
                        // 设置行高
                        $objectPHPExcel->getActiveSheet()->getRowDimension($excelRowNum)->setRowHeight(85);
                    }
                } else {
                    // 文字
                    // 转字符型字段
                    if (isset($options) && in_array($sfVal, $options['string_items'])) {
                        $objectPHPExcel->setActiveSheetIndex()->setCellValueExplicit($excelColumnNum . $excelRowNum, $item[$sfVal], \PHPExcel_Cell_DataType::TYPE_STRING);
                    } else {
                        $objectPHPExcel->setActiveSheetIndex()->setCellValue($excelColumnNum . $excelRowNum, $item[$sfVal]);
                    }
                }
            }
        }

        //生成表格文件
        ob_end_clean(); //一定要加否则打开excel后报告部分内容有问题,是否让我们修复尽量尝试恢复
        ob_start();
        //设置输出文件名及格式
        header('Content-Disposition:attachment;filename="' . urlencode($file_name) . '-' . date("YmdHis") . '.xlsx"');
        header('Content-Type:application/vnd.ms-excel;charset=utf-8');
        //导出.xls格式的话使用Excel5,若是想导出.xlsx需要使用Excel2007
        $objWriter = \PHPExcel_IOFactory::createWriter($objectPHPExcel, 'Excel2007');
        $objWriter->save('php://output');
        //删除临时图片
        foreach ($coverPicArr as $coverPicItem) {
            unlink($coverPicItem);
        }
        ob_end_flush();
        exit; //一定要加exit;否则打开excel后报告部分内容有问题,是否让我们修复尽量尝试恢复
    }
    /**
     * 下载远程图片
     * @param unknown $url
     * @param string $path
     * @return unknown
     */
    static private function download($url, $path = 'images/')
    {
        if (!file_exists($path)) {
            mkdir($path, 0755, true);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
        $file = curl_exec($ch);
        curl_close($ch);
        $filename = self::getFilename($url);
        $resource = fopen($path . $filename, 'a');
        fwrite($resource, $file);
        fclose($resource);
        return $filename;
    }
    /**
     * 
     * @param string $url
     * @return string
     */
    static private function getFilename($url)
    {
        return pathinfo($url, PATHINFO_BASENAME);
    }
    /**
     * 导出信息处理
     * @return unknown[]
     */
    static private function dataFields($fields)
    {
        $newFields = [];
        foreach ($fields as &$item) {
            if (isset($item['selected']) && $item['selected'] == 1) {
                $newFields[$item['key']] = $item['value'];
            }
        }
        return $newFields;
    }

    /**
     * @Notes:将整数转为excel对应的列标
     * @Function int_to_chr
     * @param $index  0开始的索引号
     * @param $start
     * @return string
     * @Author tj
     * @Date 2025/04/09
     */
    static public function int_to_chr($index, $start = 65)
    {
        $str = '';
        if ($index >= 26) {
            $les = $index % 26;
            $index = intval($index / 26);
            $str .= self::int_to_chr($index - 1);
            $str .= chr($start + $les);
            return $str;
        }
        return chr($start + $index) . $str;
    }

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

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

相关文章

7-openwrt-one通过web页面配置访客网络、无线中继等功能

前几个章节一直在介绍编译、分区之类的,都还没正常开始使用这个路由器的wifi。默认wifi是没有启动的,前面还是通过手动修改uci配置启动的,这个章节介绍下官方web页面的使用。特别是访客网络、无线中继 1、开启wifi,配置wifi基本信息 我们使用有线连接路由器,通过192.168.…

Android使用声网SDK实现音视频互动(RTC)功能

一、前期准备 1、注册声网账号 声网官网 2、创建项目 拿到AppID,主要证书 二、代码部分 先上一下官方提供的demo地址: Agora-RTC-QuickStart: 此仓库包含 Agora RTC Native SDK 的QuickStart示例项目。 - Gitee.comhttps://gitee.com/agoraio-comm…

FPGA_modelsim错误总结

1, 使用modelsim仿真DDR3报错Module ‘SIP_PHY_CONTROL‘ is not defined 在配置ddr3的时候vivado 速度太慢了,所以选用modelsim。我的是2018.3vivado,modelsim用了10.4 但是不行报错 然后看了帖子说 questasim可以下载了还是报错。 然后又…

了解 DeFi:去中心化金融的入门指南与未来展望

去中心化金融,或 DeFi,代表着全球金融体系运作方式的革命性转变。它是一个总称,指的是一个不断增长的去中心化应用程序(dapp)、协议和平台生态系统,这些生态系统构建在公共区块链网络上,无需传统…

Python爬虫第10节-lxml解析库用 XPath 解析网页

目录 引言 一、XPath简介 二、XPath常用规则 三、实例讲解 四、节点的选取 4.1 所有节点的选取 4.2 子节点的选取 4.3 父节点选取 五、属性匹配获取及文本获取 5.1 属性匹配 5.2 文本获取 5.3 属性获取 5.4 属性多值匹配 5.5 多属性匹配 六、按序选择 七、节点…

【C语言】预处理(预编译)(C语言完结篇)

一、预定义符号 前面我们学习了C语言的编译和链接。 在C语言中设置了一些预定义符号,其可以直接使用,预定义符号也是在预处理期间处理的。 如下: 可以看到上面的预定义符号,其都有两个短下划线,要注意的是&#xff…

关于聊天室数据库建表

首先了解一下外键 ​​一、外键的本质​​ ​​定义​​:外键是某个表中的字段(或字段组合),其值必须与另一张表的主键值相匹配。 ​​核心作用​​:强制数据一致性,维护表间关系。 二、外键的核心用途…

基于 OpenHarmony 5.0 的星闪轻量型设备应用开发-Ch1 开发环境搭建

写在前面: 文本所写的工程创建均是基于 HH-SPARK-WS63 星闪无线模组。 此篇是系列文章《基于 OpenHarmony5.0 的星闪轻量型设备应用开发》的第 1 章。 1.1 介绍 HH-SPARK-WS63 星闪无线模组(以下简称 WS63)是由润和软件推出的基于海思 WS63V…

离线安装 nvidia-docker2(nvidia-container-toolkit)

很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式 安装 nvidia-docker2 1 离线安装 (推荐) unzip解压后进入目录 dpkg -i *.d…

第7篇:Linux程序访问控制FPGA端LEDR<五>

Q:如何设计.c程序代码实现FPGA端外设LEDR流水灯? A:在DE1-SoC开发板上实现的流水灯效果:一次只点亮一个红色LED,初始状态为向左移动直至点亮LEDR9,然后改变移动的方向为向右直至点亮LEDR0,以此…

Unity 实现伤害跳字

核心组件: Dotween TextMeshPro 过程轨迹如下图: 代码如下: using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …

008二分答案+贪心判断——算法备赛

二分答案贪心判断 有些问题,从已知信息推出答案,细节太多,过程繁杂,不易解答。 从猜答案出发,贪心地判断该答案是否合法是个不错的思路,这要求所有可能的答案是单调的(例:x满足条件…

衣橱管理助手系统(衣服推荐系统)(springboot+ssm+vue+mysql)含运行文档

衣橱管理助手系统(衣服推荐系统)(springbootssmvuemysql)含运行文档 该系统名为衣橱管理助手,是一个衣物搭配管理系统,主要功能包括衣物档案管理、衣物搭配推荐、搭配收藏以及套装智能推荐。用户可以通过系统进行衣物的搭配和收藏管理,系统提…

文件上传做题记录

1,[SWPUCTF 2021 新生赛]easyupload2.0 直接上传php 再试一下phtml 用蚁剑连发现连不上 那就只要命令执行了 2,[SWPUCTF 2021 新生赛]easyupload1.0 当然,直接上传一个php是不行的 phtml也不行,看下是不是前端验证,…

Vue环境搭建:vue+idea

目录 第一章、Vue环境搭建:安装node2.1)node的下载2.2)配置node的环境变量2.3)常见的npm命令 第二章、使用idea创建vue工程2.1)在IDEA中设置国内镜像2.2)在IDEA中进行脚手架安装2.3)在IDEA中创建…

银河麒麟v10(arm架构)部署Embedding模型bge-m3【简单版本】

硬件 服务器配置:鲲鹏2 * 920(32c) 4 * Atlas300I duo卡 参考文章 https://www.hiascend.com/developer/ascendhub/detail/07a016975cc341f3a5ae131f2b52399d 鲲鹏昇腾Atlas300Iduo部署Embedding模型和Rerank模型并连接Dify(自…

轻量级碎片化笔记memos本地NAS部署与跨平台跨网络同步笔记实战

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 推荐 ​ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站 前言…

【C++算法】54.链表_合并 K 个升序链表

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 23. 合并 K 个升序链表 题目描述: 解法 解法一:暴力解法 每个链表的平均长度为n,有k个链表,时间复杂度O(nk^2) 合并两个有序…

EG8200Mini-104边缘计算网关!聚焦IEC104协议的工业数据转换与远程运维平台

在工业自动化和信息化融合不断深化的背景下,现场设备的数据采集与协议转换能力对系统集成效率与运维成本产生着直接影响。EG8200Mini-104边缘计算网关正是基于此需求场景设计,具备IEC104主从站双向支持能力,并配套远程运维与多网络接入方案&a…

python多线程+异步编程让你的程序运行更快

多线程简介 多线程是Python中实现并发编程的重要方式之一,它允许程序在同一时间内执行多个任务。在某些环境中使用多线程可以加快我们代码的执行速度,例如我们通过爬虫获得了一个图片的url数组,但是如果我们一个一个存储很明显会非常缓慢&…