首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 3.1 整合 PHPExcel 實現 Excel 匯入資料庫完整實戰

     編輯:PHP 相關知識

ThinkPHP 3.1 整合 PHPExcel 實現 Excel 匯入資料庫完整實戰

在企業級應用中,將 Excel 試算表資料批次匯入資料庫是極常見的需求。本文以 ThinkPHP 3.1 為例,詳細說明從環境佈署、前端上傳、後端解析到資料寫入的完整流程,並針對常見坑點(如副檔名不符、路徑錯誤)提供解決方案。

環境準備

  1. 下載 PHPExcel(已停更,建議新專案改用 PhpSpreadsheet)。
  2. 在 ThinkPHP 專案 Extend/Vendor/ 下建立 PHPExcel 資料夾,將 Classes 目錄完整複製進入。
  3. 確認 php.ini 已啟用 php_zip、php_xml、php_gd2 等擴充套件。

前端上傳表單

<form action="<?php echo U('Jdb/import'); ?>" method="post" enctype="multipart/form-data">
  <input type="file" name="import" accept=".xls,.xlsx" />
  <input type="hidden" name="table" value="target_table" />
  <button type="submit">匯入資料庫</button>
</form>

後端控制器核心邏輯

public function import() {
    if (empty($_FILES)) { $this->error('請選擇檔案'); return; }

    // 1. 處理檔案上傳
    import('@.ORG.UploadFile');
    $config = [
        'allowExts' => ['xls','xlsx'],
        'savePath'  => './Public/Upload/',
        'saveRule'  => 'time',
    ];
    $upload = new UploadFile($config);
    if (!$upload->upload()) { $this->error($upload->getErrorMsg()); }
    $info = $upload->getUploadFileInfo();
    $filePath = $info[0]['savepath'] . $info[0]['savename'];

    // 2. 載入 PHPExcel
    vendor('PHPExcel.PHPExcel');
    $reader = PHPExcel_IOFactory::createReader('Excel5'); // .xls
    // 若為 .xlsx 應用 'Excel2007'
    $objPHPExcel = $reader->load($filePath, 'utf-8');
    $sheet = $objPHPExcel->getSheet(0);

    // 3. 逐列讀取並寫入資料庫
    $highestRow = $sheet->getHighestRow();
    for ($row = 2; $row <= $highestRow; $row++) { // 第1列假設為標題
        $data = [
            'lianjieid' => $sheet->getCell("A{$row}")->getValue(),
            'yaoqingma' => $sheet->getCell("B{$row}")->getValue(),
            'dlmima'    => $sheet->getCell("C{$row}")->getValue(),
            'ljdizhi'   => $sheet->getCell("D{$row}")->getValue(),
        ];
        M('jdb')->add($data);
    }
    $this->success('匯入成功!共 '.($highestRow-1).' 筆資料');
}

關鍵坑點與解決方案

問題現象根本原因解決辦法
PHPExcel_Reader_Exception: The filename ... is not recognised上傳 .xlsx 卻用 Excel5 讀取器依副檔名動態選擇 createReader('Excel2007') 或 Excel5
中文欄位亂碼編碼不一致統一專案、資料庫、PHPExcel 皆使用 UTF-8;必要時 iconv() 轉碼
大檔案記憶體爆掉PHPExcel 全量載入至記憶體改用 PhpSpreadsheet 的 ChunkReadFilter 分塊讀取,或要求使用者轉 CSV
日期欄位變成數字Excel 內部以序數儲存日期用 PHPExcel_Shared_Date::ExcelToPHP() 轉換

進階建議

  • 引入 資料驗證層:匯入前檢查必填欄位、格式、唯一鍵衝突,錯誤列寫入錯誤日誌而非中斷整批。
  • 採用 Queue/Worker 非同步處理:大量資料匯入不阻塞 HTTP 回應,提升使用者體驗。
  • 提供 匯入範本下載:預先定義欄位順序與格式,減少使用者操作錯誤。

遵循上述規範,即可在 ThinkPHP 3.1 專案中穩健實現 Excel 匯入功能,為後續遷移至 ThinkPHP 5/6 或 Laravel 打下良好基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved