簡體   English   中英

使用 C# 和 EPPlus 在 Excel 中凍結窗格

[英]Freeze panes in Excel using C# and EPPlus

我想在 excel 中凍結前 5 列和 3 行。 我為此編寫了以下代碼

Worksheets.View.FreezePanes(5, 5);

但它也會凍結前 4 行中的列。 我想凍結 excel 中的前 4 列,除了前 4 行。 有可能嗎?

第一個值是您要凍結的行數,第二個值是您要凍結的列數。 因此,要凍結前 3 行和 5 列,您需要將其調用如下:

Worksheets.View.FreezePanes(3, 5);

您還可以查看此 SO 問題以獲取有關FreezePanes更多信息。

對我來說,凍結以下代碼的第一行有效。 我不確定那里的邏輯是什么。

 worksheet.View.FreezePanes(2,1);

從 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);

我知道距離該主題的上一篇文章已經很長時間了,但我最近正在處理這個問題,我找到了這種方法來獲得我想要的東西 (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"/>

這就是我提供的代碼所做的:-)

您可以調用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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM