萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

PHP 直接匯入 Excel (xls/xlsx) 到 MySQL:Spreadsheet_Excel_Reader 完整實作

環境需求

  • PHP 5.3+ / 7.x / 8.x
  • MySQL 表編碼 utf8mb4
  • Excel 檔:.xls (BIFF) 或 .xlsx (OOXML) 均支援

所需類別庫

下載 Spreadsheet_Excel_Reader (含 reader.php、oleread.inc):

require_once 'reader.php';

完整匯入腳本 (test.php)

setOutputEncoding('utf-8');  // 輸出編碼與 DB 一致
$data->read('data.xls');            // 讀取 Excel

$db = mysqli_connect('localhost', 'root', '123456', 'mydb') or die("Connect failed: " . mysqli_connect_error());
mysqli_set_charset($db, 'utf8mb4');

for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
    // 假設 Excel 前三欄對應 table 欄位
    $col1 = mysqli_real_escape_string($db, $data->sheets[0]['cells'][$i][1]);
    $col2 = mysqli_real_escape_string($db, $data->sheets[0]['cells'][$i][2]);
    $col3 = mysqli_real_escape_string($db, $data->sheets[0]['cells'][$i][3]);

    $sql = "INSERT INTO test (col1, col2, col3) VALUES ('$col1', '$col2', '$col3')";
    if (!mysqli_query($db, $sql)) {
        error_log("Row $i insert failed: " . mysqli_error($db));
    }
}
mysqli_close($db);
echo "Import done.";
?>

關鍵點

  • setOutputEncoding('utf-8') 確保讀取後編碼與資料庫一致,避免亂碼。
  • 使用 mysqli_real_escape_string 防止 SQL 注入 (或改用 Prepared Statements)。
  • Excel 索引從 1 開始 (非 0)。
  • 大量資料建議 mysqli_multi_query 批次執行或 LOAD DATA 配合 CSV 中轉。

常見問題

  • 記憶體不足:大檔案改用 PHPExcel/PhpSpreadsheet 的 chunk 讀取模式。
  • 日期格式:Excel 日期為數值序列,需 gmdate('Y-m-d', ($excelDate - 25569) * 86400) 轉換。
copyright © 萬盛學電腦網 all rights reserved