php实现excel导入数据库
使用PHPExcel库实现Excel导入数据库
PHPExcel是一个流行的PHP库,用于处理Excel文件。虽然该库已停止维护,但仍然是许多项目中的选择。
安装PHPExcel库
composer require phpoffice/phpexcel
读取Excel文件并插入数据库
require_once 'vendor/autoload.php';
$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$inputFileName = 'file.xlsx';
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
foreach($sheetData as $row) {
$stmt = $db->prepare("INSERT INTO table_name (column1, column2) VALUES (?, ?)");
$stmt->execute([$row['A'], $row['B']]);
}
使用PhpSpreadsheet实现Excel导入数据库
PhpSpreadsheet是PHPExcel的现代替代品,推荐在新项目中使用。
安装PhpSpreadsheet
composer require phpoffice/phpspreadsheet
读取Excel并导入数据库示例
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = IOFactory::load("example.xlsx");
$worksheet = $spreadsheet->getActiveSheet();
$rows = $worksheet->toArray();
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
foreach($rows as $row) {
$stmt = $pdo->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
$stmt->execute([$row[0], $row[1]]);
}
处理上传的Excel文件
创建一个HTML表单接收Excel文件
<form method="post" enctype="multipart/form-data">
<input type="file" name="excel_file">
<button type="submit">Upload</button>
</form>
处理上传的文件
if(isset($_FILES['excel_file'])) {
$file = $_FILES['excel_file']['tmp_name'];
$spreadsheet = IOFactory::load($file);
// 处理数据逻辑...
}
数据验证和错误处理
在导入前验证数据
foreach($rows as $index => $row) {
if(empty($row[0]) || !is_numeric($row[1])) {
continue; // 跳过无效行
}
// 处理有效数据...
}
使用事务确保数据完整性
$pdo->beginTransaction();
try {
foreach($rows as $row) {
// 插入数据
}
$pdo->commit();
} catch(Exception $e) {
$pdo->rollBack();
echo "导入失败: " . $e->getMessage();
}
性能优化建议
对于大数据量Excel文件,使用分块处理
$chunkSize = 500;
$totalRows = count($rows);
for($i = 0; $i < $totalRows; $i += $chunkSize) {
$chunk = array_slice($rows, $i, $chunkSize);
// 处理当前分块...
}
使用预处理语句批量插入
$stmt = $pdo->prepare("INSERT INTO table (col1, col2) VALUES (?, ?)");
foreach($rows as $row) {
$stmt->execute([$row[0], $row[1]]);
}






