在企業級 Web 應用程式中,Excel 檔案的匯入與匯出是極為常見的需求。無論是批次匯入客戶資料、產品目錄,或是匯出報表供管理層決策,掌握 ASP.NET 操作 Excel 的核心技術都能大幅提升開發效率。本文將詳細介紹如何使用 OleDb 連線技術,實現 Excel 檔案的上傳儲存與資料讀取,並提供完整可執行的程式碼範例。
我們將建立一個名為 ExcelObj 的靜態工具類別,封裝所有 Excel 操作邏輯,包含檔案上傳、路徑管理、連線字串建立、資料查詢與資源釋放等功能。這樣的設計不僅符合單一職責原則,也方便在專案中複用。
using System;
using System.Data;
using System.Web.UI.WebControls;
using System.Data.OleDb;
///
/// Excel 操作基礎類別,提供匯入匯出核心功能
///
public class ExcelObj
{
///
/// 儲存上傳的 Excel 檔案並回傳資料集
///
/// 伺服器端儲存路徑
/// FileUpload 上傳控制項
/// 包含 Excel 資料的 DataSet
public static DataSet SaveAndReturn(string savePath, FileUpload fileUpload)
{
DataSet ds = new DataSet();
string fileName = fileUpload.FileName;
if (!string.IsNullOrEmpty(fileName))
{
try
{
// 確保目錄存在
if (!System.IO.Directory.Exists(savePath))
System.IO.Directory.CreateDirectory(savePath);
// 儲存上傳檔案
string fullPath = System.IO.Path.Combine(savePath, fileName);
fileUpload.SaveAs(fullPath);
// 建立 OleDb 連線字串 (適用於 Excel 97-2003 .xls 格式)
string connString = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='{fullPath}';Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
using (OleDbConnection conn = new OleDbConnection(connString))
{
conn.Open();
// 讀取第一個工作表 (Sheet1$)
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn))
{
adapter.Fill(ds);
}
}
}
catch (Exception ex)
{
// 記錄錯誤日誌後拋出
throw new Exception($"Excel 匯入失敗: {ex.Message}", ex);
}
}
return ds;
}
}
若需支援新版 Excel 格式,請將 Provider 變更為 Microsoft.ACE.OLEDB.12.0,並安裝對應的 Access Database Engine。
實務上工作表名稱不一定為 "Sheet1",可透過 OleDbConnection.GetOleDbSchemaTable 方法動態取得所有工作表名稱:
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
foreach (DataRow row in schemaTable.Rows)
{
string sheetName = row["TABLE_NAME"].ToString();
// 過濾掉系統表 (以 $ 結尾的為工作表)
if (sheetName.EndsWith("$") || sheetName.EndsWith("$'"))
{
// 使用該工作表名稱查詢
}
}
IMEX=1 強制混合資料類型讀取為文字,避免型別轉換錯誤HDR=YES 指定第一列為標題列SqlBulkCopy 寫入資料庫<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExcelImport.aspx.cs" Inherits="Demo.ExcelImport" %>
<!DOCTYPE html>
<html>
<head>
<title>Excel 資料匯入示範</title>
</head>
<body>
<form id="form1" runat="server" enctype="multipart/form-data">
<div>
<asp:FileUpload ID="fuExcel" runat="server" Accept=".xls,.xlsx" />
<asp:Button ID="btnImport" runat="server" Text="匯入資料" OnClick="btnImport_Click" />
<br /><br />
<asp:GridView ID="gvData" runat="server" AutoGenerateColumns="true" CssClass="table"></asp:GridView>
<asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label>
</div>
</form>
</body>
</html>
protected void btnImport_Click(object sender, EventArgs e)
{
if (fuExcel.HasFile)
{
try
{
string savePath = Server.MapPath("~/Uploads/Excel/");
DataSet ds = ExcelObj.SaveAndReturn(savePath, fuExcel);
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
gvData.DataSource = ds.Tables[0];
gvData.DataBind();
lblMsg.Text = $"成功匯入 {ds.Tables[0].Rows.Count} 筆資料";
}
else
{
lblMsg.Text = "Excel 檔案無資料或格式不正確";
}
}
catch (Exception ex)
{
lblMsg.Text = $"匯入失敗: {ex.Message}";
// 記錄完整錯誤至日誌系統
}
}
else
{
lblMsg.Text = "請先選擇 Excel 檔案";
}
}
透過 OleDb 技術,ASP.NET 操作 Excel 檔案變得直觀且強大。本文提供的 ExcelObj 類別封裝了核心邏輯,支援基本的匯入需求,並可輕易擴展以支援更複雜的商業情境。開發者應根據專案需求,加入錯誤處理、日誌記錄、效能監控等企業級特性,打造穩健可維護的 Excel 整合方案。