翼度科技»论坛 编程开发 PHP 查看内容

使用ThinkPHP8实现导出Excel数据表格功能

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
1、开发版本

Think PHP8.0、PHP8.0,并非低版不能用,仅因本人当前版本如此。
部分参数需自行进行修改,具体查看执行代码.
Excel有默认的表格样式,如需修改,根据实际应用场景进行设置即可。

2、实现原理

1.安装Spreadsheet
  1. composer require phpoffice/phpspreadsheet
复制代码
2.确定数据表头
  1. $header = [
  2.   ['key' => 'index', 'title' => '序号'],
  3.   ['key' => 'activity_title', 'title' => '列1名称'],
  4.   ['key' => 'room_name', 'title' => '列2名称'],
  5. ];
复制代码
3.确定数据列
  1. $list = [];  //    定义数据内容,根据实际应用场景来写即可。
复制代码
4.调用封装类,导出数据

3、核心代码

1.调用示例
  1. //  表头$header = [
  2.   ['key' => 'index', 'title' => '序号'],
  3.   ['key' => 'activity_title', 'title' => '列1名称'],
  4.   ['key' => 'room_name', 'title' => '列2名称'],
  5. ];$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核心控制器
  1. <?php

  2. namespace app\common\controller;

  3. /**
  4. * @note Excel操作
  5. */
  6. class Excel
  7. {

  8.     //  定义表格对象
  9.     protected object $sheet;

  10.     public function __construct(object $sheet, $sheetIndex = 0)
  11.     {
  12.         $this->sheet = $sheet;
  13.         if (!is_object($this->sheet)) $this->sheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  14.         $this->sheet->getActiveSheet($sheetIndex);
  15.     }

  16.     /**
  17.      * @notes 设置表头
  18.      * @param array $header 表头数据
  19.      * @param string|int $startRow 默认第一行
  20.      */
  21.     public function setHeader(array $header, string|int $startRow = 1): object
  22.     {
  23.         $header = array_values($header);
  24.         //  计算总列数
  25.         $column = $this->getColumn(count($header));
  26.         foreach ($header as $key => $value) {
  27.             $columnName = $column[$key] . $startRow;
  28.             //  设置单元格值
  29.             $this->sheet->getActiveSheet()->setCellValue($columnName, $value['title']);
  30.             //  设置单元格自适应宽度
  31.             $this->sheet->getActiveSheet()->getColumnDimension($column[$key])->setAutoSize(true);
  32.             //  设置单元格自适应高度
  33.             $this->sheet->getActiveSheet()->getRowDimension($startRow)->setRowHeight(24);
  34.         }
  35.         $startColumn = $column[0] . $startRow;
  36.         $endColumn = $column[count($header) - 1] . $startRow;
  37.         //  设置字体大小及加粗
  38.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getFont()->setBold(true)->setSize(12);
  39.         //  设置单元格水平居中
  40.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  41.         //  设置单元格垂直居中
  42.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
  43.         //  设置单元格边框
  44.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  45.         return $this->sheet;
  46.     }

  47.     /**
  48.      * @notes 设置单元格值
  49.      * @param array $data 数据
  50.      * @param array $header 表头数据
  51.      * @param string|int $startRow 默认第二行开始
  52.      */
  53.     public function setContent(array $data, array $header, string|int $startRow = 2): object
  54.     {
  55.         //  获取总列数
  56.         $column = $this->getColumn(count($header));
  57.         //  遍历数据
  58.         foreach ($data as $key => $value) {
  59.             //  遍历表头
  60.             for ($i = 0; $i < count($header); $i++) {
  61.                 //  获取单元格名称
  62.                 $columnName = $column[$i] . ($key + $startRow);
  63.                 //  设置单元格值
  64.                 $this->sheet->getActiveSheet()->setCellValue($columnName, $value[$header[$i]['key']] ?? '');
  65.                 //  设置单元格自适应宽度
  66.                 $this->sheet->getActiveSheet()->getColumnDimension($column[$i])->setAutoSize(true);
  67.                 //  设置单元格自适应高度
  68.                 $this->sheet->getActiveSheet()->getRowDimension($key + $startRow)->setRowHeight(24);
  69.             }
  70.         }
  71.         $startColumn = $column[0] . $startRow;
  72.         $endColumn = $column[count($column) - 1] . count($data) + $startRow - 1;
  73.         //  设置字体大小及加粗
  74.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getFont()->setBold(false)->setSize(11);
  75.         //  设置单元格水平居中
  76.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  77.         //  设置单元格垂直居中
  78.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
  79.         //  设置单元格边框
  80.         $this->sheet->getActiveSheet()->getStyle($startColumn . ':' . $endColumn)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  81.         return $this->sheet;
  82.     }

  83.     /**
  84.      * @notes 导出数据
  85.      * @param string $fileName 文件名
  86.      * @param string $sheetName 表名
  87.      * @return string
  88.      */
  89.     public function export(string $fileName, string $sheetName = 'Sheet1'): string
  90.     {
  91.         //  设置表格标题
  92.         $this->sheet->getActiveSheet()->setTitle($sheetName);
  93.         //  设置表格格式
  94.         $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($this->sheet);
  95.         //  设置存储路径
  96.         $basePath = public_path();
  97.         $path = 'activity_sequence_template/';
  98.         $fullPath = $basePath . $path . $fileName . '.xlsx';
  99.         if (!is_dir($basePath . $path)) mkdir($basePath . $path, 0777, true);
  100.         $writer->save($fullPath);
  101.         return $path . $fileName . '.xlsx';
  102. //        //  设置响应头
  103. //        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  104. //        header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx"');
  105. //        header('Cache-Control: max-age=0');
  106. //        //  导出数据
  107. //        $writer->save('php://output');
  108.     }

  109.     /**
  110.      * @notes 自动计算列数
  111.      * @param int|string $colNumber
  112.      * @return array
  113.      */
  114.     protected function getColumn(int|string $colNumber = 1): array
  115.     {
  116.         //  生成A-Z的数组
  117.         $arr = range('A', 'Z');
  118.         //  计算循环次数
  119.         $no = ceil($colNumber / count($arr));
  120.         //  定义数组
  121.         $data = [];
  122.         if ($no <= 1) {
  123.             for ($i = 0; $i < $colNumber; $i++) {
  124.                 $data[] = $arr[$i];
  125.             }
  126.         } else {
  127.             for ($i = 0; $i < count($arr); $i++) {
  128.                 $data[] = $arr[$i];
  129.             }
  130.             for ($i = 0; $i < $colNumber - count($arr); $i++) {
  131.                 $list = (($i + count($arr)) % count($arr));
  132.                 $data[] = $arr[ceil(($i + 1) / count($arr)) - 1] . $arr[$list];
  133.             }
  134.         }
  135.         return $data;
  136.     }
  137. }
复制代码
到此这篇关于使用ThinkPHP8实现导出Excel数据表格功能的文章就介绍到这了,更多相关ThinkPHP8导出Excel数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/program/320533mk6.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具