PHP使用PHPExcel读取Excel数据并批量上传到数据库
在Web开发中,处理批量数据导入是一项常见的需求。通过允许用户上传Excel文件并在后台解析数据,可以极大地提高数据录入的效率。本文将详细讲解如何使用PHP结合PHPExcel库来读取Excel文件中的数据,并将其批量安全地插入到数据库中。
一、环境准备与依赖安装
PHPExcel是一个用于读写Excel文件的PHP库。尽管官方已推荐使用其升级版PhpSpreadsheet,但在许多遗留项目中,PHPExcel依然被广泛使用。在开始编码之前,需要确保开发环境满足以下要求:
PHP版本建议在5.6以上(PHPExcel对高版本PHP兼容性有限制)
开启了
php_zip、php_xml和php_gd2扩展通过Composer安装PHPExcel,或者手动下载PHPExcel类库文件并引入
如果使用Composer安装,可以在项目根目录执行以下命令:
composer require phpoffice/phpexcel
二、前端表单设计
首先需要创建一个文件上传表单,让用户能够选择并提交Excel文件。这里必须注意<form>标签的enctype属性需设置为multipart/form-data,同时使用<input type="file">标签来接收文件。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Excel数据导入</title> </head> <body> <form action="import.php" method="post" enctype="multipart/form-data"> <label for="excel_file">选择Excel文件:</label> <input type="file" name="excel_file" id="excel_file" accept=".xls,.xlsx"> <button type="submit">上传并导入</button> </form> </body> </html>
三、后端逻辑实现
后端处理逻辑主要分为三个步骤:接收并验证上传文件、使用PHPExcel读取数据、批量构建SQL语句并写入数据库。
1. 接收并验证文件
在PHP中,通过$_FILES超全局数组获取上传的文件信息,并进行基本的文件类型和错误码检查。
2. 读取Excel数据
利用PHPExcel的PHPExcel_IOFactory::load()方法可以方便地加载Excel文件。加载后,获取当前活动的工作表,并确定数据存在的最大行数和列数,然后通过循环遍历每一个单元格的数据。
3. 批量写入数据库
为了保证数据插入的效率和安全性,建议使用PDO的预处理语句,并结合事务机制。如果某一条数据插入失败,事务可以进行回滚,保证数据的完整性。
四、完整代码示例
以下是import.php文件的完整处理逻辑:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 引入PHPExcel类库文件
require_once './Classes/PHPExcel.php';
// 数据库配置
$dbHost = '127.0.0.1';
$dbName = 'test_db';
$dbUser = 'root';
$dbPass = 'password';
// 连接数据库
try {
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
// 检查是否有文件上传
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['excel_file'])) {
$fileInfo = $_FILES['excel_file'];
if ($fileInfo['error'] !== UPLOAD_ERR_OK) {
die("文件上传失败,错误码: " . $fileInfo['error']);
}
$fileExt = pathinfo($fileInfo['name'], PATHINFO_EXTENSION);
if (!in_array(strtolower($fileExt), ['xls', 'xlsx'])) {
die("请上传合法的Excel文件,仅支持xls或xlsx格式");
}
try {
// 加载Excel文件
$inputFileName = $fileInfo['tmp_name'];
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
// 获取活动工作表
$sheet = $objPHPExcel->getActiveSheet();
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
// 开启事务
$pdo->beginTransaction();
// 准备SQL预处理语句 (假设表结构为: id, name, email, age)
$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
// 假设第一行是表头,从第二行开始读取数据
for ($row = 2; $row <= $highestRow; $row++) {
// 读取每行的单元格数据
$name = $sheet->getCell('A' . $row)->getValue();
$email = $sheet->getCell('B' . $row)->getValue();
$age = $sheet->getCell('C' . $row)->getValue();
// 数据基本验证
if (empty($name) || empty($email)) {
continue; // 跳过空行
}
// 绑定参数并执行插入
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
}
// 提交事务
$pdo->commit();
echo "数据导入成功!共处理 " . ($highestRow - 1) . " 条记录。";
} catch (PHPExcel_Reader_Exception $e) {
$pdo->rollBack();
die("Excel文件读取失败: " . $e->getMessage());
} catch (PDOException $e) {
$pdo->rollBack();
die("数据库操作失败: " . $e->getMessage());
} catch (Exception $e) {
$pdo->rollBack();
die("发生错误: " . $e->getMessage());
}
} else {
echo "请通过表单提交文件。";
}
?>五、注意事项与优化建议
内存溢出问题:PHPExcel在处理大型Excel文件时非常消耗内存。如果遇到内存不足的情况,可以在脚本开头添加
ini_set('memory_limit', '512M');,或者采用PHPExcel提供的迭代器逐行读取,而不是一次性加载整个工作表。数据格式处理:Excel中的日期和时间在PHPExcel中可能被存储为数字格式。在读取这类数据时,需要使用
PHPExcel_Shared_Date::ExcelToPHPObject()方法将其转换为PHP的DateTime对象,然后再格式化为需要的字符串。安全性防范:切勿直接将读取的数据拼接成SQL字符串执行,这会导致严重的SQL注入风险。务必使用PDO或MySQLi的预处理语句。
批量插入优化:如果数据量极大,逐行执行预处理语句依然较慢。可以考虑将读取的数据拼接成多行INSERT语句(如
INSERT INTO table (a,b) VALUES (1,2),(3,4),(5,6)),每1000条执行一次,以提升写入速度。
通过上述步骤,可以实现一个稳定、安全的Excel数据导入功能。在实际应用中,开发者还需根据具体的业务规则,增加更详细的数据清洗和验证逻辑,以确保存入数据库的数据准确无误。更多关于PHPExcel的高级用法,可以参考其官方文档站点(https://www.ipipp.com)。