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

用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.mzph.cn/web/75357.shtml

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

相关文章

WHAT - React 元素接收的 ref 详解

目录 1. ref 的基本概念2. 如何使用 ref2.1 基本用法2.2 类组件使用 createRef 3. forwardRef 转发 ref4. ref 的应用场景5. ref 和函数组件总结 在 React 中,ref(引用)用于访问 DOM 元素或类组件实例。它允许我们直接与元素进行交互&#xf…

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框(自定义对话框) 一、消息盒子QMessageBox1、弹出警告盒子示例代码:现象: 2、致命错误盒子示例代码:现象: 3、帮助盒子示例代码:现象: 4、示例代码: …

依靠视频设备轨迹回放平台EasyCVR构建视频监控,为幼教连锁园区安全护航

一、项目背景 幼教行业连锁化发展态势越发明显。在此趋势下,幼儿园管理者对于深入了解园内日常教学与生活情况的需求愈发紧迫,将这些数据作为提升管理水平、优化教育服务的重要依据。同时,安装监控系统不仅有效缓解家长对孩子在校安全与生活…

Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)

目录 🧠 前言 🧾 我的需求 🔧 实现过程(按功能一步步来) 🚶‍♂️ Step 1:基本图像生成界面 🗃️ Step 2:保存图片并显示历史记录 📏 Step 3&#xff1a…

量子计算未来的潜力和挑战

据麦肯锡预测,到 2035 年或 2040 年,量子计算市场规模可能增长至约 800 亿美元。目前,许多量子比特技术正竞相成为首台通用、无差错量子计算机的基础,但仍面临诸多挑战。 我们将探讨量子计算的未来前景、潜力,以及它对…

ArcGIS 给大面内小面字段赋值

文章目录 引言:地理数据处理中的自动化赋值为何重要?实现思路模型实现关键点效果实现步骤1、准备数据2、执行3、完成4、效果引言:地理数据处理中的自动化赋值为何重要? 在地理信息系统(GIS)的日常工作中,空间数据的属性字段赋值是高频且关键的操作,例如在土地利用规划…

如何打通虚拟化-容器环境并保障流量安全?SmartX VCCI 方案升级!

为了提升资源利用率、交付效率和业务灵活性,不少企业用户都在推进从传统架构向云原生架构的演进,并采用虚拟机与容器共存的混合模式支持多种业务系统。由于两个环境在业务交互层面形成高度耦合,企业需要具备简单、高效方案,实现虚…

stable diffusion 量化加速点

文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…

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

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

AcWing 6099. 座位

原题目链接 问题描述 有 n 头奶牛(n ≥ 5),编号为 1 ∼ n,按照某种顺序围着一张圆桌坐成一圈。 奶牛之间存在如下的朋友关系: 如果两头奶牛相邻,则它们是朋友;如果两头奶牛之间只隔着一头奶…

44、Spring Boot 详细讲义(一)

Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…

配置mac mini M4 的一些软件

最近更换了 mac mini M4 ,想要重新下载配置软件 ,记录一下。 Homebrew是什么? homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等功能。通过简单的指令可以实现包管理,而不用关心各种…

网络空间安全(54)CSRF

一、定义与原理 CSRF(Cross-Site Request Forgery),全称为跨站请求伪造,也被称为One Click Attack或Session Riding,缩写为CSRF或XSRF。它是一种网络安全漏洞,攻击者通过伪造用户的请求,利用用户…

分布式文件存储系统FastDFS

文章目录 1 分布式文件存储1_分布式文件存储的由来2_常见的分布式存储框架 2 FastDFS介绍3 FastDFS安装1_拉取镜像文件2_构建Tracker服务3_构建Storage服务4_测试图片上传 4 客户端操作1_Fastdfs-java-client2_文件上传3_文件下载4_获取文件信息5_问题 5 SpringBoot整合 1 分布…

安装了VM Tools,仍无法复制拖动-解决方案

今天在安装ubuntu时遇到了困扰许久的问题,安装了VM Tools,仍无法拖动主机文件到虚拟机,主要有两种原因并对应解决办法。 1.相关虚拟机设置选项卡中-客户机隔离-两个功能没有勾选 解决方案:勾选重启虚拟机即可 2.(这个…

Jmeter分布式测试启动

代理客户端配置 打开jmeter.properties文件,取消注释并设置端口(如server_port1099), 并添加server.rmi.ssl.disabletrue禁用SSL加密。 (Linux系统)修改jmeter-server文件中的RMI_HOST_DEF为代理机实际IP。…

火语言RPA--Oracle-导入数据表格

【组件功能】:导入特定的表格数据到包含同样字段的数据表 将表格对象数据通过数据库操作对象导入到指定数据库。 配置预览 配置说明 源表格 表格来源有“来自表格对象”和“来自表达式”2种,表达式支持DataTable类型变量。 对象 对应来自表格对象&…

Java的Selenium的特殊元素操作与定位之验证码

1.使用OCR技术识别验证 步骤: 截取整个网页的截图。 定位验证码图片元素。 根据验证码图片的位置和大小,从截图中裁剪出验证码图片。 使用OCR工具(如Tesseract)识别验证码图片中的文本。 2.手动处理验证码 步骤:…

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系 OpenStack的安全组(Security Group)默认是通过Linux的iptables实现的。以下是其主要实现原理和机制: 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…

starrocks split函数和trino split函数差异性

在trino419和starrocks3.2.8中分别执行下面这两条sql,出来的结果是不一样的 select split(,,,)[1] as t1 select coalesce(split(,,&#