本文目录导读:

我来提供一个使用PhpSpreadsheet处理Excel文件的详细案例,相比已废弃的PHPExcel,PhpSpreadsheet是目前推荐的替代方案。
安装PhpSpreadsheet
首先通过Composer安装:
composer require phpoffice/phpspreadsheet
完整案例:Excel文件导入导出
导出Excel文件
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
// 创建新的Spreadsheet对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 设置表头
$headers = ['ID', '姓名', '邮箱', '电话', '创建时间'];
$columns = ['A', 'B', 'C', 'D', 'E'];
// 设置表头样式
$headerStyle = [
'font' => [
'bold' => true,
'color' => ['rgb' => 'FFFFFF'],
'size' => 12
],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => ['rgb' => '4472C4']
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER
],
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN
]
]
];
// 写入表头
foreach ($headers as $index => $header) {
$cell = $columns[$index] . '1';
$sheet->setCellValue($cell, $header);
$sheet->getStyle($cell)->applyFromArray($headerStyle);
}
// 模拟数据
$data = [
[1, '张三', 'zhangsan@example.com', '13800138001', '2024-01-15 10:30:00'],
[2, '李四', 'lisi@example.com', '13800138002', '2024-01-16 14:20:00'],
[3, '王五', 'wangwu@example.com', '13800138003', '2024-01-17 09:15:00'],
[4, '赵六', 'zhaoliu@example.com', '13800138004', '2024-01-18 16:45:00'],
[5, '孙七', 'sunqi@example.com', '13800138005', '2024-01-19 11:00:00']
];
// 写入数据
$rowNumber = 2;
foreach ($data as $row) {
foreach ($row as $index => $value) {
$cell = $columns[$index] . $rowNumber;
$sheet->setCellValue($cell, $value);
// 设置数据行样式
$sheet->getStyle($cell)->applyFromArray([
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER
],
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN
]
]
]);
}
$rowNumber++;
}
// 设置列宽
$sheet->getColumnDimension('A')->setWidth(10);
$sheet->getColumnDimension('B')->setWidth(15);
$sheet->getColumnDimension('C')->setWidth(30);
$sheet->getColumnDimension('D')->setWidth(20);
$sheet->getColumnDimension('E')->setWidth(25);
// 设置行高
$sheet->getRowDimension(1)->setRowHeight(30);
for ($i = 2; $i < $rowNumber; $i++) {
$sheet->getRowDimension($i)->setRowHeight(25);
}
// 生成Excel文件
$writer = new Xlsx($spreadsheet);
// 设置响应头
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="用户数据导出_' . date('Ymd_His') . '.xlsx"');
header('Cache-Control: max-age=0');
// 输出到浏览器
$writer->save('php://output');
exit;
导入Excel文件
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date;
function importExcel($filePath) {
try {
// 加载Excel文件
$spreadsheet = IOFactory::load($filePath);
$sheet = $spreadsheet->getActiveSheet();
// 获取最大行数和列数
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
$importedData = [];
// 跳过表头(从第2行开始)
for ($row = 2; $row <= $highestRow; $row++) {
$rowData = [];
for ($col = 1; $col <= $highestColumnIndex; $col++) {
$cellValue = $sheet->getCellByColumnAndRow($col, $row)->getValue();
// 处理日期格式
if ($col == 5 && $cellValue !== null) { // 假设第5列是日期
if (is_numeric($cellValue)) {
$cellValue = Date::excelToDateTimeObject($cellValue)->format('Y-m-d H:i:s');
}
}
$rowData[] = $cellValue;
}
// 检查是否为空行
if (array_filter($rowData, function($v) { return $v !== null && $v !== ''; })) {
$importedData[] = [
'id' => $rowData[0],
'name' => $rowData[1],
'email' => $rowData[2],
'phone' => $rowData[3],
'created_at' => $rowData[4]
];
}
}
return $importedData;
} catch (Exception $e) {
throw new Exception('文件读取失败: ' . $e->getMessage());
}
}
// 使用示例:导入上传的Excel文件
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['excel_file'])) {
try {
$file = $_FILES['excel_file'];
// 验证文件类型
$allowedTypes = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
if (!in_array($file['type'], $allowedTypes)) {
throw new Exception('只支持 .xlsx 格式的文件');
}
// 验证文件大小(限制为10MB)
if ($file['size'] > 10 * 1024 * 1024) {
throw new Exception('文件大小不能超过10MB');
}
// 导入数据
$importedData = importExcel($file['tmp_name']);
// 处理导入的数据(例如存入数据库)
foreach ($importedData as $data) {
// 这里可以添加数据库插入逻辑
echo "导入用户: {$data['name']} - {$data['email']}<br>";
}
echo "成功导入 " . count($importedData) . " 条记录";
} catch (Exception $e) {
echo "导入失败: " . $e->getMessage();
}
}
?>
<!-- 上传表单 -->
<!DOCTYPE html>
<html>
<head>Excel导入示例</title>
</head>
<body>
<h2>导入Excel文件</h2>
<form method="post" enctype="multipart/form-data">
<input type="file" name="excel_file" accept=".xlsx" required>
<button type="submit">导入</button>
</form>
</body>
</html>
高级功能:格式化单元格
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 设置单元格格式
// 数字格式
$sheet->setCellValue('A1', 1234567.89);
$sheet->getStyle('A1')->getNumberFormat()->setFormatCode('#,##0.00');
// 日期格式
$sheet->setCellValue('B1', date('Y-m-d'));
$sheet->getStyle('B1')->getNumberFormat()->setFormatCode('yyyy-mm-dd');
// 百分比格式
$sheet->setCellValue('C1', 0.85);
$sheet->getStyle('C1')->getNumberFormat()->setFormatCode('0.00%');
// 货币格式
$sheet->setCellValue('D1', 299.99);
$sheet->getStyle('D1')->getNumberFormat()->setFormatCode('¥#,##0.00');
// 设置单元格背景色
$sheet->getStyle('A1:D1')->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setARGB('FFFFE0');
// 设置文本换行
$sheet->setCellValue('A2', "这是一段很长的文本,\n需要自动换行显示");
$sheet->getStyle('A2')->getAlignment()->setWrapText(true);
// 合并单元格
$sheet->mergeCells('A3:D3');
$sheet->setCellValue('A3', '合并单元格的标题');
$sheet->getStyle('A3')->getAlignment()
->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
注意事项
- 内存管理:处理大文件时使用
$spreadsheet->disconnectWorksheets();释放内存 - 错误处理:始终使用 try-catch 捕获异常
- 性能优化:读取大文件时可以使用
PhpOffice\PhpSpreadsheet\Reader\Xlsx的setReadDataOnly(true)方法 - 版本兼容:确保服务器安装了 PHP 7.1+ 和必要的扩展(如 zip、xml)
这个案例包含了日常开发中最常用的Excel处理功能,包括导出、导入和格式化。