ThinkPHP8 导出Excel数据表格

server/2024/9/25 12:40:56/

1、开发版本

Think PHP8.0、PHP8.0,并非低版不能用,仅因本人当前版本如此。

部分参数需自行进行修改,具体查看执行代码.

Excel有默认的表格样式,如需修改,根据实际应用场景进行设置即可。

2、实现原理

1.安装Spreadsheet

php">composer require phpoffice/phpspreadsheet

2.确定数据表头

php">$header = [['key' => 'index', 'title' => '序号'],['key' => 'activity_title', 'title' => '列1名称'],['key' => 'room_name', 'title' => '列2名称'],
];

3.确定数据列

php">$list = [];  //    定义数据内容,根据实际应用场景来写即可。

4.调用封装类,导出数据

3、核心代码

1.调用示例

php"> //  表头
$header = [['key' => 'index', 'title' => '序号'],['key' => 'activity_title', 'title' => '列1名称'],['key' => 'room_name', 'title' => '列2名称'],
];
$list = [];
//  实例化excel
$sheet = new Spreadsheet();
//  实例化导出类
$export = new Excel($sheet, 0);
//  设置单元格表头
$export->setHeader($header);
//  设置单元格数据
$export->setContent($list, $header);
//  导出:文件名称、sheet名称,返回结果为本地文件存储路径
$res = $export->export($fileName, $sheetName);

2.Excel核心控制器

php"><?phpnamespace app\common\controller;/*** @note Excel操作*/
class Excel
{//  定义表格对象protected object $sheet;public function __construct(object $sheet, $sheetIndex = 0){$this->sheet = $sheet;if (!is_object($this->sheet)) $this->sheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();$this->sheet->getActiveSheet($sheetIndex);}/*** @notes 设置表头* @param array $header 表头数据* @param string|int $startRow 默认第一行*/public function setHeader(array $header, string|int $startRow = 1): object{$header = array_values($header);//  计算总列数$column = $this->getColumn(count($header));foreach ($header as $key => $value) {$columnName = $column[$key] . $startRow;//  设置单元格值$this->sheet->getActiveSheet()->setCellValue($columnName, $value['title']);//  设置单元格自适应宽度$this->sheet->getActiveSheet()->getColumnDimension($column[$key])->setAutoSize(true);//  设置单元格自适应高度$this->sheet->getActiveSheet()->getRowDimension($startRow)->setRowHeight(24);}$startColumn = $column[0] . $startRow;$endColumn = $column[count($header) - 1] . $startRow;//  设置字体大小及加粗$this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getFont()->setBold(true)->setSize(12);//  设置单元格水平居中$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;}/*** @notes 设置单元格值* @param array $data 数据* @param array $header 表头数据* @param string|int $startRow 默认第二行开始*/public function setContent(array $data, array $header, string|int $startRow = 2): object{//  获取总列数$column = $this->getColumn(count($header));//  遍历数据foreach ($data as $key => $value) {//  遍历表头for ($i = 0; $i < count($header); $i++) {//  获取单元格名称$columnName = $column[$i] . ($key + $startRow);//  设置单元格值$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);}}$startColumn = $column[0] . $startRow;$endColumn = $column[count($column) - 1] . count($data) + $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;}/*** @notes 导出数据* @param string $fileName 文件名* @param string $sheetName 表名* @return string*/public function export(string $fileName, string $sheetName = 'Sheet1'): string{//  设置表格标题$this->sheet->getActiveSheet()->setTitle($sheetName);//  设置表格格式$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($this->sheet);//  设置存储路径$basePath = public_path();$path = 'activity_sequence_template/';$fullPath = $basePath . $path . $fileName . '.xlsx';if (!is_dir($basePath . $path)) mkdir($basePath . $path, 0777, true);$writer->save($fullPath);return $path . $fileName . '.xlsx';
//        //  设置响应头
//        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
//        header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx"');
//        header('Cache-Control: max-age=0');
//        //  导出数据
//        $writer->save('php://output');}/*** @notes 自动计算列数* @param int|string $colNumber* @return array*/protected function getColumn(int|string $colNumber = 1): array{//  生成A-Z的数组$arr = range('A', 'Z');//  计算循环次数$no = ceil($colNumber / count($arr));//  定义数组$data = [];if ($no <= 1) {for ($i = 0; $i < $colNumber; $i++) {$data[] = $arr[$i];}} else {for ($i = 0; $i < count($arr); $i++) {$data[] = $arr[$i];}for ($i = 0; $i < $colNumber - count($arr); $i++) {$list = (($i + count($arr)) % count($arr));$data[] = $arr[ceil(($i + 1) / count($arr)) - 1] . $arr[$list];}}return $data;}
}


http://www.ppmy.cn/server/27047.html

相关文章

构建中小型企业网络-单臂路由

1.给IP地址配置好对应的IP和网关 2.配置交换机 3.路由配置 在交换机ge0/0/1中配置端口为trunk是可以允许多个vlan通过的&#xff0c;但路由器是不能够配置vlan&#xff0c;而交换机和路由器间连接的只有一根线&#xff0c;一个端口又只能配置一个ip地址&#xff0c;只有一个ip地…

自动化测试——Selenium:开启Web应用测试的新篇章

自动化测试——Selenium&#xff1a;开启Web应用测试的新篇章 摘要&#xff1a; 随着Web技术的迅猛发展&#xff0c;Web应用的质量和性能成为了企业竞争力的重要指标。自动化测试作为软件测试领域的重要技术&#xff0c;对于提高测试效率、保证产品质量具有显著优势。Selenium…

Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决总结

Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决 文章目录 Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决一、前言二、Android13源码下简单demo应用代码编译报错和分析解决1、AndroidManifest.xml文件代码&#xff1a;2、AndroidM…

Linux从入门到精通

第一章> 1、文件、用户、组、权限 2、Linux运行级别指定 3、文件目录指令 4、基础指令 第二章> 5、搜索、过滤、压缩 6、Shell脚本 7、配置JDK …

Git学习笔记(五)IDEA使用Git

在前面几篇文章中&#xff0c;我们已经介绍了git的基础知识&#xff0c;知道了其主要作用是用来进行代码的版本管理&#xff1b;并且已经介绍了Git操作的常用命令。在日常的开发环境下&#xff0c;除了通过Bash命令行来操作Git之外&#xff0c;我们另外一种常用的操作方式则是直…

数据结构----顺序表详解

顺序表的定义 顺序表&#xff08;SeqList&#xff09;属于线性表的同一种&#xff0c;它同样具有线性的存储结构&#xff0c;以下是百度百科关于顺序表的定义&#xff1a; 总结下来&#xff0c; 在结构上&#xff0c;顺序表实际上的底层结构就是数组&#xff0c;而顺序表本身也…

高德地图API入门使用vue

文章目录 最终效果一、在高德的开放平台申请key二、下载依赖&#xff1a;三、完整代码 最终效果 页面显示高德地图 一、在高德的开放平台申请key 在高德的开放平台申请key&#xff1a; https://console.amap.com/dev/key/app 申请的类型为web端&#xff08;js api&#xff…

Vitis HLS 学习笔记--S_AXILITE 寄存器及驱动

目录 1. 简介 2. S_AXILITE Registers 寄存器详解 2.1 “隐式”优势 2.2 驱动程序文件 2.3 硬件头文件 2.4 硬件头文件中 SC/COR/TOW/COH 的解释 2.5 驱动控制过程 3. 总结 1. 简介 回顾此博文《Vitis HLS 学习笔记--Syn Report解读&#xff08;1&#xff09;-CSDN博…