本文目录导读:

我来提供一个使用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处理功能,包括导出、导入和格式化。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播