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

C# 操作 Excel 的另類高效方案:HTML 模板導出法

     編輯:關於C#

痛點:傳統 COM 元件操作 Excel 的弊端

在 .NET 中引用 Microsoft.Office.Interop.Excel 雖然功能強大,但存在公認缺點:

  • 依賴客戶端安裝 Office,部署麻煩;
  • 進程殘留問題嚴重,即使調用 Marshal.ReleaseComObject 仍難根治;
  • 效能低下,大量數據寫入時極其緩慢;
  • 伺服器端自動化不受 Microsoft 支援,易導致權限、對話框阻塞。

核心思路:Excel → HTML 模板 → ASPX 動態渲染 → 以 .xls 回應

利用 Excel 原生「另存為網頁」功能,將排版好的樣板匯出為 HTML,保留所有樣式、凍結窗格、儲存格保護等屬性。再在 ASP.NET 頁面中用 Repeater 綁定數據動態生成 <tr>,最後將 Response.ContentType 設為 application/ms-excel,瀏覽器即會彈出下載並自動以 Excel 開啟,完美保留鎖定欄位、格式、公式等特性,且全程無 Excel 進程產生。

實作步驟詳解

1. 製作 Excel 模板

  • 新建 學生成績表.xls,設定欄標、字體、邊框、凍結首行(選第二行首儲存格 → 視窗 → 凍結窗格)。
  • 全選 → 滑鼠右鍵「設定儲存格格式」→「保護」→ 取消「鎖定」;再選擇需鎖定的三欄(學號、姓名、成績)→ 勾選「鎖定」。
  • 輸入一筆測試資料,工具 → 保護 → 保護工作表。此時嘗試修改鎖定欄位會彈出警告,確認保護生效。

2. 匯出 HTML 並移植到 ASPX

  • Excel 中「另存為網頁」得 學生成績表.htm 及同名資料夾。
  • 用記事本開啟 .htm,複製 <html> 至 </html> 所有內容到空白 Export.aspx,保留 <%@ Page ... %> 指令,並在 <body> 內加入 <form id="form1" runat="server">。

3. 替換靜態資料為 Repeater 綁定

找到測試資料對應的 <tr> 區塊,註釋掉並替換為:

<asp:Repeater ID="rptData" runat="server">
    <ItemTemplate>
        <tr height=19 style='height:14.25pt'>
            <td height=19 class=xl27 style='height:14.25pt' x:num><%# Eval("id") %></td>
            <td class=xl27><%# Eval("name") %></td>
            <td class=xl27 x:num><%# Eval("achievement") %></td>
            <td class=xl25></td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

4. 後端綁定資料並輸出 Excel

protected void Page_Load(object sender, EventArgs e) {
    this.EnableViewState = false;
    LoadData();

    Response.Clear();
    Response.Buffer = true;
    Response.Charset = "GB2312";
    Response.AppendHeader("Content-Disposition", 
        "attachment; filename=" + HttpUtility.UrlEncode("學生成績表.xls", Encoding.UTF8));
    Response.ContentEncoding = Encoding.GetEncoding("GB2312");
    Response.ContentType = "application/ms-excel";
    // Response.End(); // 避免 ThreadAbortException,建議用 CompleteRequest
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}

private void LoadData() {
    var users = new List<User> {
        new User(1, "劉一", 81), new User(2, "陳二", 82), new User(3, "張三", 83),
        new User(4, "李四", 84), new User(5, "王五", 85), new User(6, "趙六", 86),
        new User(7, "孫七", 87), new User(8, "周八", 88), new User(9, "吳九", 89),
        new User(10, "鄭十", 80)
    };
    rptData.DataSource = users;
    rptData.DataBind();
}

[Serializable]
private class User {
    public int id { get; set; }
    public string name { get; set; }
    public decimal achievement { get; set; }
    public User(int id, string name, decimal achievement) {
        this.id = id; this.name = name; this.achievement = achievement;
    }
}

效果驗證

  • 下載後以 Excel 開啟,鎖定欄位(學號、姓名、成績)不可編輯,嘗試修改會彈出「儲存格受保護」提示。
  • 「老師評價」欄可自由輸入,格式、凍結窗格、樣式完整保留。
  • 全程無 EXCEL.EXE 進程殘留,適合伺服器端高併發導出。

優缺點總結與適用場景

優點缺點/注意
零 Office 依賴,部署極簡導出的 .xls 實為 HTML,若再另存為真正 .xls 會產生 .files 資料夾
無進程殘留,伺服器穩定不支援複雜公式、圖表、樞紐分析等高階 Excel 功能
樣式、保護、凍結窗格完美保留超大數據量(>10 萬列)HTML 字串過大可能影響效能
開發效率高,前端排版所見即所得需注意編碼一致性(GB2312/UTF-8),否則中文亂碼

適用場景:固定格式報表、需鎖定部分欄位的表單導出、無 Office 環境的伺服器端批量導出。

結語

「解決一個問題盡量多想多了解多找一些方案和方法,比較各個方案的優缺點,再選一種適合自己實際情況的來實現。」HTML 模板法雖非萬能,但在「格式固定、需保護、無 Office 環境」的典型業務場景下,往往是性價比最高的選擇。

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