你是否需要一个关于用PHPExcel或PhpSpreadsheet处理Excel文件的案例

wen PHP项目 41

本文目录导读:

你是否需要一个关于用PHPExcel或PhpSpreadsheet处理Excel文件的案例

  1. 安装PhpSpreadsheet
  2. 完整案例:Excel文件导入导出
  3. 注意事项

我来提供一个使用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);

注意事项

  1. 内存管理:处理大文件时使用 $spreadsheet->disconnectWorksheets(); 释放内存
  2. 错误处理:始终使用 try-catch 捕获异常
  3. 性能优化:读取大文件时可以使用 PhpOffice\PhpSpreadsheet\Reader\XlsxsetReadDataOnly(true) 方法
  4. 版本兼容:确保服务器安装了 PHP 7.1+ 和必要的扩展(如 zip、xml)

这个案例包含了日常开发中最常用的Excel处理功能,包括导出、导入和格式化。

抱歉,评论功能暂时关闭!