在 C# 中拆分 Excel 工作表窗格,核心是通過 Microsoft.Office.Interop.Excel(COM 組件)或 EPPlus(開源庫,無需安裝 Excel)操作工作表的 SplitPanes 方法。以下是兩種主流方案的詳細步驟、代碼示例和注意事項,兼顧易用性和實用性:

一、方案一:使用 Microsoft.Office.Interop.Excel(需安裝 Excel)

適用於已安裝 Microsoft Excel 的環境,功能完整,直接調用 Excel 原生 API。

1. 環境準備

  • 安裝 Excel(支持 2013+ 版本);
  • 項目中添加引用:右鍵項目 → 引用 → COM → 勾選 Microsoft Excel X.X Object Library(X.X 為 Excel 版本號,如 16.0 對應 Excel 2016/2019/365)。

2. 核心原理

通過 Worksheet.SplitPanes 方法,指定拆分位置的行號和列號,實現水平拆分、垂直拆分或雙向拆分:

  • 水平拆分:固定上方行(如拆分後上方顯示前 2 行,下方滾動);
  • 垂直拆分:固定左側列(如拆分後左側顯示前 1 列,右側滾動);
  • 雙向拆分:同時固定上方行和左側列。

3. 代碼示例(完整可運行)

csharp

運行

using System;
using Microsoft.Office.Interop.Excel;

namespace ExcelSplitPanesDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 創建 Excel 應用實例
            Application excelApp = new Application();
            excelApp.Visible = true; // 顯示 Excel 窗口(調試用)

            try
            {
                // 2. 打開現有工作簿(或創建新工作簿)
                Workbook workbook = excelApp.Workbooks.Open(@"C:\Test\測試文件.xlsx");
                Worksheet worksheet = workbook.Worksheets["Sheet1"]; // 指定工作表

                // 3. 拆分窗格(三種常見場景,按需選擇)
                // 場景1:水平拆分(固定前 2 行,拆分線在第 2 行下方)
                worksheet.SplitPanes = worksheet.Cells[3, 1]; // 行號 3,列號 1 → 拆分線在第 2 行後

                // 場景2:垂直拆分(固定前 1 列,拆分線在第 1 列右側)
                // worksheet.SplitPanes = worksheet.Cells[1, 2]; // 行號 1,列號 2 → 拆分線在第 1 列後

                // 場景3:雙向拆分(固定前 2 行 + 前 1 列)
                // worksheet.SplitPanes = worksheet.Cells[3, 2]; // 行號 3,列號 2 → 拆分線在第 2 行後、第 1 列後

                // 4. 可選:凍結拆分窗格(防止拆分後的窗格相對移動)
                // worksheet.EnableFreezePanes = true;

                // 5. 保存文件(若需永久保存拆分狀態)
                workbook.Save();
                Console.WriteLine("窗格拆分成功!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"錯誤:{ex.Message}");
            }
            finally
            {
                // 6. 釋放資源(避免 Excel 進程殘留)
                excelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
            }
        }
    }
}

4. 關鍵説明

  • SplitPanes = worksheet.Cells[row, col]:拆分線的位置由 row 和 col 決定:
  • 水平拆分:col=1row 為拆分線下方的第一行(如 row=3 表示拆分線在第 2 行後);
  • 垂直拆分:row=1col 為拆分線右側的第一列(如 col=2 表示拆分線在第 1 列後);
  • EnableFreezePanes = true:凍結拆分窗格,使固定部分不會隨滾動移動(類似 Excel 中的 “凍結窗格” 功能);
  • 注意釋放 COM 資源:必須調用 Quit() 和 Marshal.ReleaseComObject(),否則 Excel 進程會在後台殘留。

二、方案二:使用 EPPlus(開源庫,無需安裝 Excel)

適用於未安裝 Excel 的環境(如服務器),輕量級,支持 .xlsx 格式(不支持 .xls)。

1. 環境準備

  • 通過 NuGet 安裝 EPPlus:右鍵項目 → 管理 NuGet 程序包 → 搜索 EPPlus → 安裝(推薦 4.5.3 及以上版本,需同意開源協議)。

2. 核心原理

EPPlus 通過 Worksheet.View.SplitHorizontal(水平拆分行數)和 Worksheet.View.SplitVertical(垂直拆分列數)控制拆分,搭配 FreezePanes 實現凍結。

3. 代碼示例(完整可運行)

csharp

運行

using System;
using OfficeOpenXml;

namespace EPPlusSplitPanesDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 注意:EPPlus 5+ 版本需設置許可證上下文(開源非商業用途)
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            string filePath = @"C:\Test\測試文件.xlsx";
            using (ExcelPackage package = new ExcelPackage(new System.IO.FileInfo(filePath)))
            {
                // 1. 獲取工作表
                ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];

                // 2. 拆分窗格(三種常見場景,按需選擇)
                // 場景1:水平拆分(固定前 2 行)
                worksheet.View.SplitHorizontal = 2; // 拆分上方 2 行
                worksheet.View.FreezePanes = true; // 凍結拆分(可選)

                // 場景2:垂直拆分(固定前 1 列)
                // worksheet.View.SplitVertical = 1; // 拆分左側 1 列
                // worksheet.View.FreezePanes = true;

                // 場景3:雙向拆分(固定前 2 行 + 前 1 列)
                // worksheet.View.SplitHorizontal = 2;
                // worksheet.View.SplitVertical = 1;
                // worksheet.View.FreezePanes = true;

                // 3. 保存文件
                package.Save();
                Console.WriteLine("窗格拆分成功!");
            }
        }
    }
}

4. 關鍵説明

  • SplitHorizontal = n:水平拆分,固定上方 n 行(如 n=2 表示上方 2 行固定,下方滾動);
  • SplitVertical = m:垂直拆分,固定左側 m 列(如 m=1 表示左側 1 列固定,右側滾動);
  • FreezePanes = true:凍結拆分窗格(必須設置,否則拆分後窗格會隨滾動同步移動,無實際效果);
  • 支持格式:僅 .xlsx(不支持老版本 .xls),若需處理 .xls 可搭配 NPOI 庫。

三、兩種方案對比與注意事項

特性

Microsoft.Office.Interop.Excel

EPPlus

依賴環境

必須安裝 Excel

無需安裝 Excel(純 .NET 庫)

支持格式

.xls、.xlsx

.xlsx(不支持 .xls)

易用性

直接映射 Excel 操作,上手快

語法簡潔,輕量級

適用場景

桌面應用(已裝 Excel)

服務器 / 無 Excel 環境

進程殘留風險

有(需手動釋放 COM 資源)

無(純託管代碼)

注意事項

  1. 路徑處理:避免使用中文路徑(可能導致文件打開失敗),建議用絕對路徑;
  2. 權限問題:寫入文件時需確保程序有文件夾讀寫權限;
  3. 版本兼容性:Interop.Excel 需匹配 Excel 版本,EPPlus 需注意許可證設置(5+ 版本必填)。

四、總結

  • 若本地已安裝 Excel,優先使用 Interop.Excel,功能完整且貼近 Excel 原生操作;
  • 若需在服務器或無 Excel 環境使用,優先選擇 EPPlus,輕量無依賴,適合批量處理;
  • 拆分窗格的核心是 “指定固定行數 / 列數”,搭配凍結功能可提升使用體驗,兩種方案均支持水平、垂直、雙向三種拆分場景,按需選擇即可。