如何使用Hyperf框架进行Excel导出
导出数据到Excel是我们在开发过程中经常遇到的需求之一。在Hyperf框架下,我们可以借助第三方库PhpSpreadsheet来实现Excel导出的功能。本文将详细介绍如何使用Hyperf框架进行Excel导出,并提供具体的代码示例。
一、安装依赖库
首先,需要在Hyperf框架项目中安装PhpSpreadsheet库。在项目根目录下执行以下命令:
composer require phpoffice/phpspreadsheet
二、创建导出类
我们首先创建一个Excel导出的类,用于封装导出功能的具体实现。在AppUtils
目录下创建ExcelExporter.php
文件,代码如下:
namespace AppUtils; use PhpOfficePhpSpreadsheetSpreadsheet; use PhpOfficePhpSpreadsheetWriterXlsx; class ExcelExporter { public static function export($data, $fileName, $headers, $title = null) { // 创建Excel对象 $spreadsheet = new Spreadsheet(); // 设置工作表名称 $worksheet = $spreadsheet->getActiveSheet(); $worksheet->setTitle($title ?: 'Sheet1'); // 写入表头 foreach ($headers as $key => $header) { $column = chr(65 + $key); // 列名,如A、B、C... $worksheet->setCellValue($column.'1', $header); } // 写入数据 $row = 2; // 数据行起始行号 foreach ($data as $item) { foreach ($item as $key => $value) { $column = chr(65 + $key); // 列名,如A、B、C... $worksheet->setCellValue($column.$row, $value); } $row++; } // 导出Excel文件 $writer = new Xlsx($spreadsheet); $writer->save($fileName); } }
以上代码中,export
方法接收四个参数:
-
$data
: 需要导出的数据,二维数组 -
$fileName
: 导出的文件名,含文件路径 -
$headers
: 表头,一维数组 -
$title
: 工作表名称,可选参数,默认为Sheet1
三、使用导出类
完成导出类的编写后,我们可以在需要导出数据的控制器中进行调用。以下是一个示例,以导出用户信息为例:
<?php namespace AppController; use AppUtilsExcelExporter; use HyperfHttpServerAnnotationAutoController; /** * @AutoController() */ class UserController extends AbstractController { public function export() { // 模拟数据 $data = [ ['id' => 1, 'name' => 'Tom', 'age' => 18], ['id' => 2, 'name' => 'Jerry', 'age' => 20], ['id' => 3, 'name' => 'Alice', 'age' => 22], ]; // 表头 $headers = ['ID', '姓名', '年龄']; // 文件名 $fileName = '/path/to/export/user.xlsx'; // 调用导出方法 ExcelExporter::export($data, $fileName, $headers, '用户信息'); return $this->success('导出成功'); } }
在以上示例中,我们模拟了一组用户信息数据,设置了表头和导出的文件名。调用导出方法后,成功导出Excel文件,并返回导出成功的提示。
四、总结
使用Hyperf框架进行Excel导出,可以利用PhpSpreadsheet库提供的功能,通过封装导出类来实现。通过以上代码示例,我们可以快速实现数据导出到Excel文件的功能。同时,我们也可以根据实际需求对导出类进行扩展,以满足更多复杂的导出需求。
原文来自:www.php.cn© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容