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

时间:2015-01-21 06:58:51

标签: c# epplus

我想在excel中冻结前5列和3行。 我已为此编写了以下代码

Worksheets.View.FreezePanes(5, 5);

但它也会冻结前4行中的列。 我想冻结excel中的前4列,前4行除外。 有可能吗?

5 个答案:

答案 0 :(得分:40)

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

Worksheets.View.FreezePanes(3, 5);

您还可以查看this SO question了解有关FreezePanes

的更多信息

答案 1 :(得分:18)

让我冻结代码工作后的第一行。我不确定那里的逻辑是什么。

 worksheet.View.FreezePanes(2,1);

答案 2 :(得分:7)

从ExcelWorksheet对象中,访问查看属性。

在返回的ExcelWorksheetView对象上,调用 FreezePanes(行,列) 方法,传递第一个未冻结的单元格的行和列< /强>

例如,要冻结Excel工作表的第一个完整的两个窗格,您需要将 (3,1) 列传递给行参数:< / p>

worksheetObject.View.FreezePanes(3, 1);

所以要 完全冻结第一行 ,您现在只能致电worksheetObject.View.FreezePanes(2,1);

这是EPPlus官方示例中的also mentioned

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

worksheetObject.View.FreezePanes(3, 5);

答案 3 :(得分:0)

我知道距离上次发布该主题已经很长时间了,但我最近正在处理这个问题,我找到了我想要的方法 (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>

由此推断,我必须将“窗格”节点添加到 xml 结构中:

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

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

答案 4 :(得分:-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);
        }
    }
}