在Web开发中,将数据库中的数据导出为Excel文件是一项常见需求,尤其适用于数据报表、备份或离线分析,PHPExcel(现升级为PhpSpreadsheet)是PHP中处理Excel文件的强大工具,支持多种格式,并提供了丰富的操作接口,本文将详细介绍如何使用PhpSpreadsheet实现数据库数据的Excel导出,包括环境准备、核心步骤及注意事项,帮助开发者高效完成这一任务。

环境准备与依赖安装
在开始之前,需确保开发环境满足基本要求,PHP版本需≥7.1,因为PhpSpreadsheet依赖PHP的某些高级特性,通过Composer安装PhpSpreadsheet库,命令为composer require phpoffice/phpspreadsheet,若数据库为MySQL,需确保PDO或MySQLi扩展已启用,以便连接数据库并获取数据,安装完成后,在PHP文件中引入自动加载文件:require 'vendor/autoload.php';,即可使用PhpSpreadsheet的类。
数据库连接与数据查询
导出Excel的第一步是从数据库获取数据,以MySQL为例,使用PDO连接数据库并执行查询。
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'root';
$password = '';
$pdo = new PDO($dsn, $username, $password);
$stmt = $pdo->query('SELECT id, name, email FROM users');
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
这里,fetchAll方法以关联数组形式返回所有数据,便于后续处理,若数据量较大,建议分页查询或使用游标(PDO::FETCH_COLUMN)以避免内存溢出。
创建Excel对象与基本设置
获取数据后,需创建PhpSpreadsheet对象并初始化工作表,核心代码如下:
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('用户数据');
$spreadsheet代表整个Excel工作簿,$sheet为当前活动工作表,可通过setTitle方法设置工作表名称,便于识别。

数据写入与样式优化
将数据库数据写入Excel时,需遍历数组并逐行填充,第一行用于表头,后续行填充数据。
// 写入表头
$headers = ['ID', '姓名', '邮箱'];
$sheet->fromArray($headers, null, 'A1');
// 写入数据
$sheet->fromArray($data, null, 'A2');
// 设置表头样式
$headerStyle = [
'font' => ['bold' => true],
'fill' => ['fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, 'color' => ['rgb' => 'E0E0E0']]
];
$sheet->getStyle('A1:C1')->applyFromArray($headerStyle);
fromArray方法可快速将数组数据写入指定单元格,同时支持样式设置,通过getStyle方法,可调整字体、背景色、边框等,提升表格可读性,自动调整列宽可使用$sheet->getColumnDimension('A')->setAutoSize(true);。
文件输出与下载
完成数据写入后,需将Excel文件输出到浏览器或保存到服务器,以下为下载示例:
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="users.xlsx"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
Content-Type声明文件类型,Content-Disposition设置文件名及下载模式。php://output表示直接输出到浏览器,若需保存到服务器,可替换为文件路径(如./files/users.xlsx)。
常见问题与解决方案
在实际开发中,可能会遇到以下问题:

- 大数据量导致内存溢出:PhpSpreadsheet会将整个文件加载到内存,若数据量过大(如超过10万行),建议改用
CsvWriter或分 sheet 导出。 - 中文乱码问题:确保文件编码为UTF-8,并在输出时添加
header('Content-Type: text/html; charset=utf-8');,检查数据库连接字符集是否为utf8mb4。
相关问答FAQs
Q1: 如何在Excel中添加图片或图表?
A: PhpSpreadsheet支持通过Drawing类添加图片,
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Logo');
$drawing->setPath('path/to/logo.png');
$drawing->setCoordinates('A1');
$drawing->setOffsetX(10);
$drawing->setWorksheet($sheet);
图表可通过Chart类创建,需先定义数据系列再渲染到工作表。
Q2: 如何导出为旧版Excel(.xls)格式?
A: PhpSpreadsheet默认导出为.xlsx(Office 2007+),若需.xls格式,需安装phpoffice/phpxls并使用XlsWriter:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet);
$writer->save('file.xls');
注意.xls格式对行数和列数有限制(最大65536行、256列)。