如何在C#中创建Excel文件

如何使用 C# 在 Excel 中添加冻结窗格

This article was translated from English: Does it need improvement?
Translated
View the article in English

在超过 50 行或超过 Z 列的大型 Excel 电子表格中,既要查看数据,又要保持标题可见是一项挑战。 C# 中的 "冻结窗格 "功能提供了一个优雅的解决方案,它可以锁定特定的行和列,同时允许其余行和列自由滚动。

在处理财务报告、员工数据库或库存清单等需要持续查看列标题或行标识符的工作时,该功能变得至关重要。 利用IronXL的Excel库,您可以在.NET应用程序中以编程方式添加冻结窗格,以改善数据导航和用户体验。

快速入门:将标题行和列锁定在一行中

使用简单的CreateFreezePane(colSplit, rowSplit)方法可以在几秒钟内冻结行或列。 无需复杂的设置--只需加载您的工作表,调用此方法,您的标题就会在滚动时锁定在顶部。

Nuget Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 IronXL

    PM > Install-Package IronXL.Excel

  2. 复制并运行这段代码。

    workSheet.CreateFreezePane(1, 4);
  3. 部署到您的生产环境中进行测试

    立即开始在您的项目中使用 IronXL,免费试用!
    arrow pointer


如何在 Excel 中添加冻结窗格?

冻结窗格可将行和列锁定在原位,使其在滚动时保持可见。 该功能可在快速比较信息的同时保持页眉列或行的位置不变。 当处理大型数据集或在浏览大量电子表格时需要保持上下文一致时,该功能尤为重要。

IronXL.Excel 中的冻结窗格功能模仿了 Excel 的本地功能,对于熟悉 Excel 界面的开发人员来说非常直观。 与Excel Interop 解决方案不同,IronXL 提供了一种更高效、服务器友好的方法,以编程方式实现冻结窗格。

CreateFreezePane 如何使用 2 个参数工作?

要添加冻结窗格,请使用CreateFreezePane方法,并指定冻结窗格应从哪一列和哪一行开始。 指定的列和行未包含在冻结窗格中。 例如,workSheet.CreateFreezePane(1, 4)A 列1 至 4 行开始创建冻结窗格。

理解基于零的索引至关重要:第 0 列指 A 列,第 1 列指 B 列,依此类推。 行索引采用相同的模式。 这种方法非常适合在滚动浏览数据条目时保持标题可见的情况。

以下代码示例演示了如何从 B 列第 4 行开始创建冻结窗格:

:path=/static-assets/excel/content-code-examples/how-to/add-freeze-panes-add.cs
using IronXL;
using System.Linq;

WorkBook workBook = WorkBook.Load("sample.xlsx");
WorkSheet workSheet = workBook.WorkSheets.First();

// Create freeze pane from column(A-B) and row(1-3)
workSheet.CreateFreezePane(2, 3);

workBook.SaveAs("createFreezePanes.xlsx");
Imports IronXL
Imports System.Linq

Private workBook As WorkBook = WorkBook.Load("sample.xlsx")
Private workSheet As WorkSheet = workBook.WorkSheets.First()

' Create freeze pane from column(A-B) and row(1-3)
workSheet.CreateFreezePane(2, 3)

workBook.SaveAs("createFreezePanes.xlsx")
$vbLabelText   $csharpLabel

冻结窗格的实际效果如何?

Freeze Pane in Action

如何移除冻结窗格?

使用 RemovePane 方法从电子表格中删除所有现有的冻结窗格。 当您需要根据用户偏好或数据变化重置视图或应用不同的冻结设置时,这将非常有用。

:path=/static-assets/excel/content-code-examples/how-to/add-freeze-panes-remove.cs
// Remove all existing freeze or split pane
workSheet.RemovePane();
' Remove all existing freeze or split pane
workSheet.RemovePane()
$vbLabelText   $csharpLabel

高级冻结窗格选项有哪些?

CreateFreezePane方法提供了一个高级选项,用于创建具有预滚动功能的冻结窗格。 当您希望在保持冻结窗格功能的同时,将注意力集中在电子表格的特定区域时,该功能非常有用。

何时应使用高级冻结面板的 4 个参数?

此方法允许您根据指定的起始列和行添加冻结窗格。 此外,它还允许您在工作表中应用滚动功能。 在使用 格式化 Excel 报告时,如果需要精确控制初始视图,这一点尤其重要。

例如,使用 workSheet.CreateFreezePane(5, 2, 6, 7) 创建一个横跨 A-E 列1-2 行的冻结窗格。 它包含一个 1 列 5 行的滚动条。 打开工作表时,会显示 列 A-E、G-... 行 1-2、8-...

:path=/static-assets/excel/content-code-examples/how-to/add-freeze-panes-advance.cs
using IronXL;
using System.Linq;

WorkBook workBook = WorkBook.Load("sample.xlsx");
WorkSheet workSheet = workBook.WorkSheets.First();

// Overwriting freeze or split pane to column(A-E) and row(1-5) as well as applying prescroll
// The column will show E,G,... and the row will show 5,8,...
workSheet.CreateFreezePane(5, 5, 6, 7);

workBook.SaveAs("createFreezePanes.xlsx");
Imports IronXL
Imports System.Linq

Private workBook As WorkBook = WorkBook.Load("sample.xlsx")
Private workSheet As WorkSheet = workBook.WorkSheets.First()

' Overwriting freeze or split pane to column(A-E) and row(1-5) as well as applying prescroll
' The column will show E,G,... and the row will show 5,8,...
workSheet.CreateFreezePane(5, 5, 6, 7)

workBook.SaveAs("createFreezePanes.xlsx")
$vbLabelText   $csharpLabel

高级冻结窗格看起来像什么?

Excel 冻结窗格演示,显示带有冻结标题和 ID 列的员工数据,蓝色箭头表示冻结边界

冻结面板的实际使用案例

冻结面板在各种业务场景中都非常宝贵:

1.财务报告:在滚动浏览年度数据时保持月/季度标题可见 2.员工数据库:在查看绩效指标的同时锁定员工姓名和 ID 3.库存管理:在查看库存水平时修正产品代码和名称 4.销售仪表板:在分析区域销售数据的同时保持产品类别的可见性

当与Excel 公式结合使用时,冻结窗格可显著提高数据分析效率。

完整示例:使用冻结面板构建数据报告

下面是一个综合示例,展示了如何使用冻结窗格创建格式化报告:

using IronXL;
using IronXL.Styles;

// Create a new workbook
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("Sales Report");

// Add headers
workSheet["A1"].Value = "Product ID";
workSheet["B1"].Value = "Product Name";
workSheet["C1"].Value = "Q1 Sales";
workSheet["D1"].Value = "Q2 Sales";
workSheet["E1"].Value = "Q3 Sales";
workSheet["F1"].Value = "Q4 Sales";
workSheet["G1"].Value = "Total";

// Style headers
var headerRange = workSheet["A1:G1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.Color = "#FFFFFF";

// Add sample data
for (int i = 2; i <= 50; i++)
{
    workSheet[$"A{i}"].Value = $"P{i-1:D3}";
    workSheet[$"B{i}"].Value = $"Product {i-1}";
    workSheet[$"C{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"D{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"E{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"F{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"G{i}"].Formula = $"=SUM(C{i}:F{i})";
}

// Apply freeze pane to keep headers visible
workSheet.CreateFreezePane(0, 1);

// Auto-size columns for better visibility
workSheet.AutoSizeColumn(0, 6);

// Save the workbook
workBook.SaveAs("SalesReportWithFreezePanes.xlsx");
using IronXL;
using IronXL.Styles;

// Create a new workbook
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("Sales Report");

// Add headers
workSheet["A1"].Value = "Product ID";
workSheet["B1"].Value = "Product Name";
workSheet["C1"].Value = "Q1 Sales";
workSheet["D1"].Value = "Q2 Sales";
workSheet["E1"].Value = "Q3 Sales";
workSheet["F1"].Value = "Q4 Sales";
workSheet["G1"].Value = "Total";

// Style headers
var headerRange = workSheet["A1:G1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.Color = "#FFFFFF";

// Add sample data
for (int i = 2; i <= 50; i++)
{
    workSheet[$"A{i}"].Value = $"P{i-1:D3}";
    workSheet[$"B{i}"].Value = $"Product {i-1}";
    workSheet[$"C{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"D{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"E{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"F{i}"].Value = Random.Shared.Next(1000, 5000);
    workSheet[$"G{i}"].Formula = $"=SUM(C{i}:F{i})";
}

// Apply freeze pane to keep headers visible
workSheet.CreateFreezePane(0, 1);

// Auto-size columns for better visibility
workSheet.AutoSizeColumn(0, 6);

// Save the workbook
workBook.SaveAs("SalesReportWithFreezePanes.xlsx");
Imports IronXL
Imports IronXL.Styles

' Create a new workbook
Dim workBook As WorkBook = WorkBook.Create()
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Sales Report")

' Add headers
workSheet("A1").Value = "Product ID"
workSheet("B1").Value = "Product Name"
workSheet("C1").Value = "Q1 Sales"
workSheet("D1").Value = "Q2 Sales"
workSheet("E1").Value = "Q3 Sales"
workSheet("F1").Value = "Q4 Sales"
workSheet("G1").Value = "Total"

' Style headers
Dim headerRange = workSheet("A1:G1")
headerRange.Style.Font.Bold = True
headerRange.Style.BackgroundColor = "#4472C4"
headerRange.Style.Font.Color = "#FFFFFF"

' Add sample data
For i As Integer = 2 To 50
    workSheet($"A{i}").Value = $"P{i - 1:D3}"
    workSheet($"B{i}").Value = $"Product {i - 1}"
    workSheet($"C{i}").Value = Random.Shared.Next(1000, 5000)
    workSheet($"D{i}").Value = Random.Shared.Next(1000, 5000)
    workSheet($"E{i}").Value = Random.Shared.Next(1000, 5000)
    workSheet($"F{i}").Value = Random.Shared.Next(1000, 5000)
    workSheet($"G{i}").Formula = $"=SUM(C{i}:F{i})"
Next

' Apply freeze pane to keep headers visible
workSheet.CreateFreezePane(0, 1)

' Auto-size columns for better visibility
workSheet.AutoSizeColumn(0, 6)

' Save the workbook
workBook.SaveAs("SalesReportWithFreezePanes.xlsx")
$vbLabelText   $csharpLabel

本示例演示了冻结窗格如何与 单元样式 公式配合使用,以创建专业报告。 当用户滚动浏览 50 行销售数据时,标题行仍然可见。

性能考虑

在大型电子表格中实施冻结窗格时:

  • 在填充数据后应用冻结窗格以获得最佳性能
  • 考虑使用条件格式突出显示冻结部分的重要数据
  • 使用目标数据量进行测试,确保流畅的滚动性能

对于处理大量数据集的应用程序,可探讨 导出到不同格式或在冻结窗格旁实施分页策略。

请注意只能应用一种冻结窗格设置。 任何后续创建的冻结窗格都会覆盖之前的冻结窗格。 冻结窗格不适用于 Microsoft Excel 97-2003 版 (.xls).

常见问题解答

什么是冻结窗格功能,为什么它在 Excel 电子表格中很有用?

冻结窗格功能可锁定特定的行和列,使其在滚动浏览大型电子表格时保持可见。这对于保持财务报告、员工数据库或库存清单中标题的可见性尤为有用。IronXL 提供了一个简单的 CreateFreezePane 方法,可在 C# 应用程序中以编程方式实现该功能。

如何在 C# 中快速添加冻结窗格以锁定标题行?

使用 IronXL,只需一行代码,您就可以使用 CreateFreezePane 方法锁定标题行。只需调用 workSheet.CreateFreezePane(1, 4) 即可冻结列和行。这将锁定列 A 和第 1-4 行,同时允许电子表格的其他部分自由滚动。

在 CreateFreezePane 中使用 2 个参数和 4 个参数有什么区别?

IronXL 的 CreateFreezePane 方法提供两种选项:使用 2 个参数(colSplit、rowSplit)可从指定位置创建基本的冻结窗格,而使用 4 个参数则可添加具有预滚动定位功能的冻结窗格,从而对查看区域进行更高级的控制。

在设置冻结窗格时,基于零的索引是如何工作的?

在 IronXL 的 CreateFreezePane 方法中,索引是基于 0 的。列 0 表示列 A,列 1 表示列 B,以此类推。同样,行索引从 0 开始。 例如,CreateFreezePane(1, 4) 从 A 列开始创建冻结窗格,包括第 1 至 4 行。

为什么要使用此库而不是 Excel Interop 来冻结窗格?

与 Excel Interop 解决方案相比,IronXL.Excel 提供了一种更高效、服务器友好的方法。它不需要在服务器上安装 Excel,为大型数据集提供更好的性能,并提供直观的 API,在模仿 Excel 本机功能的同时针对 .NET 应用程序进行了优化。

能否将带有冻结窗格的电子表格导出为不同的文件格式?

是的,使用 IronXL 的 CreateFreezePane 方法添加冻结窗格后,您可以将电子表格导出为各种文件格式,同时保持冻结窗格功能。在保存为支持的 Excel 格式时,库会保留这些设置。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 1,846,091 | 版本: 2026.2 刚刚发布