快速將 Excel 檔案 (.xls / .xlsx) 匯入 DataSet,適合離線資料處理、報表匯入、批次匯入前驗證等場景。
public static DataSet ExcelToDataSet(string filePath, string sheetName)
{
var ds = new DataSet();
try
{
// 建立 OLEDB 連線字串 (支援 .xls 與 .xlsx)
string connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={filePath};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'";
// 注意:.xls 舊格式請用 Microsoft.Jet.OLEDB.4.0 / Excel 8.0
using (var conn = new OleDbConnection(connStr))
{
conn.Open();
string query = $"SELECT * FROM [{sheetName}$]"; // 工作表名稱需加 $ 符號
using (var adapter = new OleDbDataAdapter(query, conn))
{
adapter.Fill(ds, sheetName);
}
}
}
catch (Exception ex)
{
// 實務建議:記錄日誌而非直接 MessageBox
System.Windows.Forms.MessageBox.Show($"Excel 匯入失敗: {ex.Message}");
}
return ds;
}
| 參數 | 說明 |
|---|---|
Provider | Microsoft.ACE.OLEDB.12.0 支援 .xlsx/.xls;Microsoft.Jet.OLEDB.4.0 僅支援 .xls (32-bit 限制) |
Extended Properties | Excel 12.0 Xml 對應 .xlsx;Excel 8.0 對應 .xls |
HDR=YES | 第一列視為標題欄位名;HDR=NO 則以 F1, F2... 命名 |
IMEX=1 | 混合資料類型欄位強制以文字讀取,避免數值/日期格式衝突導致空值 |
[{sheetName}$] | 工作表名稱必須加 $ 結尾;若名稱含空格請用單引號包裹 '[Sheet 1$]' |
Prefer 32-bit。conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null) 列出所有工作表。SqlBulkCopy 直接寫入 SQL Server,或使用 EPPlus/NPOI 免 OLEDB 解析。原始範例使用 Microsoft.Jet.OLEDB.4.0 與 Excel 8.0,僅相容 .xls 格式。現代專案建議改用 ACE Provider 統一處理新舊格式,並加入 IMEX=1 避免型別推斷問題。