ThinkPHP8导出Excel单元格为下拉选择框

news/2024/9/20 1:21:05/ 标签: excel, Thinkphp, 导出Excel, 导出Excel下拉, PHP
说明

本文章是基于上一篇ThinkPHP8 导出Excel数据表格文章的完善版,上一篇仅导出为文本框,此处增加下拉框。

其他内容与上一章不变,此处展示不同内容。

更改

1.头部数组修改

增加type类型,text为文本框,select为下拉框,具体其他需求自行扩展。

['key' => 'field', 'title' => '内容', 'type' => 'text'],
['key' => 'date', 'title' => '日期', 'type' => 'select'],

2.设置内容方法修改

仅需要替换该方法即可,具体内容可根据业务场景自行修改。

/*** @notes 设置单元格值* @param array $data 数据* @param array $header 表头数据* @param string|int $startRow 默认第二行开始* @return object*/public function setContent(array $data, array $header, string|int $startRow = 2): object{//  获取总列数$column = $this->getColumn(count($header));$totalColumn = count($data);//  遍历数据foreach ($data as $key => $value) {//  遍历表头for ($i = 0; $i < count($header); $i++) {//  获取单元格名称$columnName = $column[$i] . ($key + $startRow);$columnType = $header[$i]['type'];$columnValue = $value[$header[$i]['key']] ?? '';//  设置单元格数据switch ($columnType) {case 'text':$this->sheet->getActiveSheet()->setCellValue($columnName, $columnValue);break;case 'select':$objValidation = $this->sheet->getActiveSheet()->getCell($columnName)->getDataValidation();$objValidation->setType(DataValidation::TYPE_LIST)->setErrorStyle(DataValidation::STYLE_INFORMATION)->setAllowBlank(false)->setShowInputMessage(true)->setShowErrorMessage(true)->setShowDropDown(true)->setErrorTitle('输入的值有误')->setError('您输入的值不在下拉框列表内.')->setPromptTitle('')->setPrompt('')->setFormula1('"' . $columnValue . '"');break;default:$this->sheet->getActiveSheet()->setCellValue($columnName, $value[$header[$i]['key']] ?? '');}//  设置单元格自适应宽度$this->sheet->getActiveSheet()->getColumnDimension($column[$i])->setAutoSize(true);//  设置单元格自适应高度$this->sheet->getActiveSheet()->getRowDimension($key + $startRow)->setRowHeight(24);}unset($data[$key]);}$startColumn = $column[0] . $startRow;$endColumn = $column[count($column) - 1] . $totalColumn + $startRow - 1;//  设置字体大小及加粗$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getFont()->setBold(false)->setSize(11);//  设置单元格水平居中$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);//  设置单元格垂直居中$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);//  设置单元格边框$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);return $this->sheet;}


http://www.ppmy.cn/news/1456113.html

相关文章

充电宝买哪个牌子?四款性能超强充电宝牌子推荐!速来码住!

在快节奏的现代生活中&#xff0c;手机已经成为了我们最亲密的伙伴。无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。然而&#xff0c;手机电量的问题总是让人头疼。特别是在外出旅行时&#xff0c;手机电量耗尽更是让人倍感焦虑。为了解决这个问题&#xf…

Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装

参考文档 Taro.request(option) 在 src/http 下创建 request.ts, 写入如下配置&#xff1a; import Taro from tarojs/taro import { encryptData } from ./encryptconsole.log(NODE_ENV, process.env.NODE_ENV) console.log(TARO_APP_PROXY, process.env.TARO_APP_PROXY) c…

应用分层和企业规范

目录 一、应用分层 1、介绍 &#xff08;1&#xff09;为什么需要应用分层&#xff1f; &#xff08;2&#xff09;如何分层&#xff1f;&#xff08;三层架构&#xff09; MVC 和 三层架构的区别和联系 高内聚&#xff1a; 低耦合&#xff1a; 2、代码重构 controlle…

R-Tree原理及实现代码

R-Tree 原理 R-Tree&#xff08;也称为R树或R*树&#xff09;是一种空间索引数据结构&#xff0c;用于存储多维空间中的对象&#xff0c;如二维空间中的点和多边形。R-Tree 最初由 Antonin Guttman 在 1984 年提出&#xff0c;它解决了 B-Tree 和其变种在空间数据索引中的不足…

Python使用割圆法求π值

三国时期刘徽提出的割圆法有多牛掰&#xff0c;看这个&#xff1a;刘徽割圆术到底做了什么&#xff1f; - 知乎 用Python实现的该算法代码如下&#xff1a; #!/usr/bin/env python """使用割圆法计算π值Usage::$ python calc_circle_pi.py 20 # 参数20是迭代…

最适合程序员的浏览器翻译插件——简约翻译!

1.支持功能 划词翻译&#xff08;读音、解释、词性全都有&#xff0c;还可收藏词汇&#xff09; 网页双语对照翻译 YouTube字幕翻译 输入框翻译 鼠标悬停翻译 2.自定义翻译规则 规则订阅/规则分享 自定义专业术语 3.自定义快捷键 AltQ 开启翻译 Alt…

Mysql 行格式 DYNAMIC 和 COMPACT 区别

MySQL的InnoDB存储引擎提供了多种行格式&#xff0c;其中DYNAMIC和COMPACT是两种常见的选择。这两种行格式在处理数据时有一些关键的区别&#xff0c;尤其是在管理大字段&#xff08;如BLOB、TEXT和大的VARCHAR字段&#xff09;方面。以下是DYNAMIC和COMPACT行格式的主要区别&a…

类和对象-Python-第一部分

初识对象 使用对象组织数据 class Student:nameNonegenderNonenationalityNonenative_placeNoneageNonestu_1Student()stu_1.name"林军杰" stu_1.gender"男" stu_1.nationality"中国" stu_1.native_place"山东" stu_1.age31print(stu…

C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

森林消防泵操作指南:守护绿色的必备技能/恒峰智慧科技

在广袤无垠的森林中&#xff0c;每一片绿叶都承载着生命的希望。然而&#xff0c;当火焰无情地吞噬这片生机时&#xff0c;我们需要一种强大的力量来与之抗衡。这时&#xff0c;森林消防泵便成为了我们的守护者&#xff0c;掌握其操作技巧&#xff0c;更是每一位热爱大自然者的…

《Video Mamba Suite》论文笔记(4)Mamba在时空建模中的作用

原文翻译 4.4 Mamba for Spatial-Temporal Modeling Tasks and datasets.最后&#xff0c;我们评估了 Mamba 的时空建模能力。与之前的小节类似&#xff0c;我们在 Epic-Kitchens-100 数据集 [13] 上评估模型在zero-shot多实例检索中的性能。 Baseline and competitor.ViViT…

C++ | 类和对象(上)

目录 什么是类 类的介绍 struct在两种语言中的有何区别 私有变量命名注意点 类的作用域 类的声明定义分离 类的访问限定符 封装 类的实例化 类对象的存储 this指针 一道this指针相关的王炸题&#xff1a; 结语 什么是类 类的介绍 我们举一个日常生活中的例子&…

【开发技巧 | 第三篇】windows端口被占用及解决方法

文章目录 3.windows端口被占用及解决方法3.1查看指定端口被占用情况3.2根据PID查看对应的进程3.3根据PID杀死对应的进程3.4小结 3.windows端口被占用及解决方法 3.1查看指定端口被占用情况 netstat -aon|findstr 7090或 netstat -aon|findstr "7090"最后一列数字为…

优雅处理返回信息状态码:Result对象在Spring Boot中的应用

前言 在开发过程中&#xff0c;处理返回的信息状态码是一个重要的问题&#xff0c;尤其是在大型项目中。为了统一处理这些状态码&#xff0c;我在Spring Boot中创建了一个名为Result的Java对象&#xff0c;用于封装返回的信息和状态码。在本文中&#xff0c;我将分享如何实现这…

Agent AI智能体:我们的生活即将如何改变?

你有没有想过&#xff0c;那个帮你设置闹钟、提醒你朋友的生日&#xff0c;甚至帮你订外卖的智能助手&#xff0c;其实就是Agent AI智能体&#xff1f;它们已经在我们生活中扮演了越来越重要的角色。现在&#xff0c;让我们一起想象一下&#xff0c;随着这些AI智能体变得越来越…

基于Python的LSTM网络实现单特征预测回归任务

长短期记忆网络&#xff08;Long Short-Term Memory, LSTM&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c;适用于处理时间序列数据和其他序列数据的预测问题。它特别适合处理具有时间依赖性和长期依赖关系的序列数据。 以下是基于Python和Keras…

Redis领航分布式:Java实现高效Session管理

在构建分布式系统时&#xff0c;用户的会话管理是一个至关重要的问题。传统的基于服务器的会话管理方案可能会面临单点故障和性能瓶颈等问题。 而基于 Redis 的分布式会话管理方案能够有效地解决这些问题&#xff0c;并提供高可用性和性能。 本文将深入探讨 Redis 实现分布式…

从简单逻辑到复杂计算:感知机的进化与其在现代深度学习和人工智能中的应用(上)

文章目录 引言第一章&#xff1a;感知机是什么第二章&#xff1a;简单逻辑电路第三章&#xff1a;感知机的实现3.1 简单的与门实现3.2 导入权重和偏置3.3 使用权重和偏置的实现实现与门实现与非门和或门 文章文上下两节 从简单逻辑到复杂计算&#xff1a;感知机的进化与其在现代…

【Java】Stream流、方法引用(Java8)

Stream流 中间方法 distinct() 使用HashSet去重 终结方法 toArray() value 表示 流中数据的个数&#xff0c;要跟数组的长度保持一致。 collect() 收集到map中&#xff0c;比较复杂。需要指定 键 和 值 的生成规则。 方法引用 01_引用静态方法 ​ 引用类方法&#xff0c;其实…

leetcode---岛屿数量

. - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; //岛屿题目的思想&#xff1a;二维矩阵图的DFS就是&#xff0c;上下左右遍历如果是0或者出界的话就return //规定的是陆地上下左右是水的话它就是岛屿。当遍历矩阵图中每一个点&#xff0c; //在调用递归算法之前…