使用C#和EPPlus在Excel中冻结窗格

43

我想在Excel中冻结前5列和前三行。我已经写了以下代码。

Worksheets.View.FreezePanes(5, 5);

但是它也会冻结前4行中的列。 我想在Excel中冻结前4个列,除了前4行。 这可行吗?


我不确定我完全理解你想做什么。你是说你想从第5行开始冻结吗?所以当你向右滚动时,A1到D4单元格不会被冻结?这是Excel中可以做的事情吗? - Ernie S
工作语法是Worksheets.View.FreezePanes(r+1, c+1); 其中r->要冻结的行数,c->要冻结的列数。 - Thamarai T
5个回答

65

第一个值是您想要冻结的行数,第二个值是您想要冻结的列数。因此,要冻结前3行和前5列,您需要将其调用为以下内容:

Worksheets.View.FreezePanes(3, 5);

您还可以查看此SO问题获取有关FreezePanes的更多信息。


6
目前情况下,冻结顶部行会在某种程度上禁用水平滚动。 - Rozen
4
实际上,根据@digEmAll在此回答中(https://dev59.com/IV4c5IYBdhLWcg3wUI4N#34432320)的(正确)评论,您传递了第一个未被冻结的单元格的位置,因此您应该实际使用`Worksheet.View.FreezePanes(4, 6);`来回答OP的问题。 - Caltor

45

对于我来说,以下代码可以冻结第一行。我不确定其中的逻辑。

 worksheet.View.FreezePanes(2,1);

2
sheet.View.FreezePanes(6, 1); 为我冻结了前5行。 - CAD bloke
2
我假设你需要在冻结的行/列数上加一,因为 Excel 的工作方式是相同的。要在 Excel 中冻结第一行,你必须选择前两行(不要问我为什么)。 - Austin Adams
9
@AustinAdams:因为(在Excel和EPPlus中)你需要指定代表未冻结区域左上角的单元格。基本上你是在说:“好的,这是可滚动区域的第一个左上角单元格;所有在它上面的单元格都被视为列标题,所有在左侧的单元格都被视为行标题”。 - digEmAll
@digEmAll 哇,你说得对!我刚试了一下,在 Excel 中,当你只选择下面一行时也可以冻结上面一行。我之前不知道这个功能。谢谢你的解释。 - Austin Adams

16

从ExcelWorksheet对象中访问View属性。

在返回的ExcelWorksheetView对象上调用FreezePanes(row, column)方法,传递第一个未被冻结的单元格的行和列。

例如,要冻结Excel工作表的前两个完整窗格,需要将列(3,1)传递给行参数:

worksheetObject.View.FreezePanes(3, 1);

因此,要完全冻结第一行,只需调用worksheetObject.View.FreezePanes(2,1);

EPPlus的官方示例中也提到了这一点。

因此,回答@user2148124提出的原始问题的答案应为

worksheetObject.View.FreezePanes(3, 5);

1
当输入FreezePanes(1,1)或其中一个参数为0时,Excel文件将会损坏,告诉我们Excel将尝试修复它(当然不会使冻结起作用)。 - Juan Ignacio Avendaño Huergo
每个开源插件都有一些限制或缺点。如果你能提供一些更好的替代选择,请告诉我。 - vibs2006
我只是在补充你的信息,这非常有用,而不是批评框架。 :D - Juan Ignacio Avendaño Huergo
当我冻结第一行时,worksheetObject.View.FreezePanes(2,1) 对我有用 :) - Techgeeks1

2

我知道距离上次发布这个主题已经有很长一段时间了,但最近我正在处理这个问题,并找到了获取我想要的方式(EPPlus v4.5.3):

public static void FreezeHeader(ExcelWorksheet sheet)
{
        var xdoc = sheet.WorksheetXml;

        var sheetViews = xdoc.GetElementsByTagName("sheetViews");
        var sheetViewNode = sheetViews[0].ChildNodes[0];

        var paneNode = xdoc.CreateNode(System.Xml.XmlNodeType.Element, "pane", xdoc.DocumentElement.NamespaceURI);

        var ySplit = xdoc.CreateAttribute("ySplit");
        ySplit.Value = "1";

        var topLeftCell = xdoc.CreateAttribute("topLeftCell");
        topLeftCell.Value = "A2";

        var activePane = xdoc.CreateAttribute("activePane");
        activePane.Value = "bottomLeft";

        var state = xdoc.CreateAttribute("state");
        state.Value = "frozen";

        paneNode.Attributes.Append(ySplit);
        paneNode.Attributes.Append(topLeftCell);
        paneNode.Attributes.Append(activePane);
        paneNode.Attributes.Append(state);

        sheetViewNode.AppendChild(paneNode);
}

我通过比较两个Excel文件的xml(一个包含冻结的标题,另一个不包含)来实现这一点。
通常,在创建简单的Excel文件时,您会得到以下内容:
<sheetViews>
   <sheetView workbookViewId="0">
   </sheetView>
</sheetViews>

现在,如果您冻结第一行并检查XML,您会发现:
<sheetViews>
<sheetView tabSelected="1" topLeftCell="Z1" zoomScale="85" zoomScaleNormal="85" workbookViewId="0">
    <pane ySplit="1" topLeftCell="A213" activePane="bottomLeft" state="frozen"/>
    <selection activeCell="O1" sqref="O1"/><selection pane="bottomLeft" activeCell="AD229" sqref="AD229"/>
</sheetView>

我推断出我需要将“pane”节点添加到XML结构中:

<pane ySplit="1" topLeftCell="A213" activePane="bottomLeft" state="frozen"/>

这是我提供的代码所做的事情 :-)

-5

您可以调用 sheet.FreezePanes(int rowIndex, int columnIndex) 方法来设置冻结区域。

代码示例:

using System;
using Spire.Xls;
using System.Drawing;

namespace FreezePane
{
    class Program
    {
        static void Main(string[] args)
        {
            //Load File
            Workbook workbook = new Workbook();
            workbook.LoadFromFile
                (@"E:\Work\Documents\ExcelFiles\UserInfo.xlsx");
            Worksheet sheet = workbook.Worksheets[0];

            //Freeze Top Row
            sheet.FreezePanes(2, 1);

            //Save and Launch
            workbook.SaveToFile("FreezePane.xlsx", ExcelVersion.Version2010);
            System.Diagnostics.Process.Start(workbook.FileName);
        }
    }
}

3
我认为OP特别询问了EPPlus,而不是Spire.Xls - Scott Stafford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接