在 C# 中拆分 Excel 工作表窗格,核心是通過 Microsoft.Office.Interop.Excel(COM 組件)或 EPPlus(開源庫,無需安裝 Excel)操作工作表的 SplitPanes 方法。以下是兩種主流方案的詳細步驟、代碼示例和注意事項,兼顧易用性和實用性:
一、方案一:使用 Microsoft.Office.Interop.Excel(需安裝 Excel)
1. 環境準備
- 安裝 Excel(支持 2013+ 版本);
- 項目中添加引用:右鍵項目 → 引用 → COM → 勾選 Microsoft Excel X.X Object Library(X.X 為 Excel 版本號,如 16.0 對應 Excel 2016/2019/365)。
2. 核心原理
- 水平拆分:固定上方行(如拆分後上方顯示前 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=1,row為拆分線下方的第一行(如row=3表示拆分線在第 2 行後); - 垂直拆分:
row=1,col為拆分線右側的第一列(如col=2表示拆分線在第 1 列後);
EnableFreezePanes = true:凍結拆分窗格,使固定部分不會隨滾動移動(類似 Excel 中的 “凍結窗格” 功能);- 注意釋放 COM 資源:必須調用
Quit()和Marshal.ReleaseComObject(),否則 Excel 進程會在後台殘留。
二、方案二:使用 EPPlus(開源庫,無需安裝 Excel)
1. 環境準備
- 通過 NuGet 安裝 EPPlus:右鍵項目 → 管理 NuGet 程序包 → 搜索 EPPlus → 安裝(推薦 4.5.3 及以上版本,需同意開源協議)。
2. 核心原理
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 資源)
|
無(純託管代碼)
|
注意事項
四、總結
- 若本地已安裝 Excel,優先使用 Interop.Excel,功能完整且貼近 Excel 原生操作;
- 若需在服務器或無 Excel 環境使用,優先選擇 EPPlus,輕量無依賴,適合批量處理;
- 拆分窗格的核心是 “指定固定行數 / 列數”,搭配凍結功能可提升使用體驗,兩種方案均支持水平、垂直、雙向三種拆分場景,按需選擇即可。