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

ASP.NET 讀取 Excel 混合資料類型出現空值問題解決

     編輯:關於ASP.NET

使用 Microsoft.Jet.OLEDB.4.0 讀取 Excel 時,若某欄位前幾列為純數字、後續混入文字,會導致文字資料讀成 null。根因在於 OLEDB 驅動程式預設只掃描前 8 列(TypeGuessRows=8)推斷資料型別,若掃描範圍內數字佔多數,整欄就被判定為數值型,不符合的文字便捨棄為空值。

解決方案:連接字串加參數 + 修改登錄檔

1. 連接字串加入 IMEX=1 與 HDR=YES

string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0; 
    Data Source=" + _physicalPath + @";
    Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
  • HDR=YES:第一列為標題,不當資料。
  • IMEX=1:關鍵參數,強制將混合型欄位視為文字讀取,避免型別衝突導致資料遺失。

2. 修改登錄檔 TypeGuessRows 為 0(掃描全欄)

路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows

  • 預設值 8:僅掃前 8 列。
  • 改為 0:掃描整欄資料決定型別(效能稍降,但準確)。
  • 64 位元系統另需檢查 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows。

原理深度解析

驅動程式採樣邏輯:

  1. 讀取前 N 列(N = TypeGuessRows)。
  2. 統計各型別出現次數,佔多數者定為該欄型別。
  3. 後續資料若不符合此型別,直接回傳 DBNull.Value。

範例:前 8 列有 5 數字 + 3 文字 → 判定為數字欄 → 後面文字全變 null。

進階替代方案(推薦新專案)

  • EPPlus / ClosedXML / NPOI:純 .NET 程式庫,不依賴 Office 元件、無 32/64 位元困擾、支援 .xlsx、型別控制彈性高。
  • ACE OLEDB 12.0/16.0:支援 .xlsx,連接字串 Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'。

快速檢查清單

  1. 連接字串含 IMEX=1?
  2. 登錄檔 TypeGuessRows=0?
  3. 目標機器已安裝對應 OLEDB/ACE 驅動?
  4. IIS 應用程式集區「啟用 32 位元應用程式」設正確(若用 32 位驅動)?

套用上述兩步驟,即可解決 90% 以上的 Excel 匯入空值問題。

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