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

ASP.NET 實作 Excel 資料匯入與匯出完整教學

     編輯:關於ASP.NET

前言

在企業級 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;
    }
}

進階應用與注意事項

1. 相容 Excel 2007+ (.xlsx) 格式

若需支援新版 Excel 格式,請將 Provider 變更為 Microsoft.ACE.OLEDB.12.0,並安裝對應的 Access Database Engine。

2. 動態取得工作表名稱

實務上工作表名稱不一定為 "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("$'"))
    {
        // 使用該工作表名稱查詢
    }
}

3. 大量資料效能優化

  • 使用 IMEX=1 強制混合資料類型讀取為文字,避免型別轉換錯誤
  • 搭配 HDR=YES 指定第一列為標題列
  • 大量資料建議分批處理或使用 SqlBulkCopy 寫入資料庫

4. 安全性考量

  • 限制上傳檔案副檔名 (.xls, .xlsx) 與 MIME 類型
  • 採用亂數重新命名檔案,避免路徑遍歷攻擊
  • 定期清理暫存目錄,防止磁碟空間耗盡

前端頁面範例

<%@ 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 整合方案。

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