簡體   English   中英

凍結 OpenXml 中的窗格 SDK 2.0 for Excel 文檔

[英]Freeze Panes in OpenXml SDK 2.0 for Excel document

我正在使用 OpenXml 生成一個 Excel 工作簿,並一直在關注 http://msdn.microsoft.com/en-us/library/cc850837.aspx中的示例

如果我可以凍結頂部窗格,那將非常有用,但我找不到執行此操作的方法。 我意識到如果我使用http://closedxml.codeplex.com/我可以做到這一點,但現在我想堅持使用 OpenXml SDK

有任何想法嗎?

我試圖解決同樣的問題並最終打開 Open XML SDK 2.0 Productivity Tool 並使用Compare Files...功能來比較兩個電子表格,一個有凍結窗格,一個沒有。

當我這樣做時,我被引導到基本上看起來像這樣的代碼:

WorkbookPart wbp = doc.WorkbookPart;
WorksheetPart wsp = wbp.WorksheetParts.First();

SheetViews sheetviews = wsp.Worksheet.GetFirstChild<SheetViews>();
SheetView sv = sheetviews.GetFirstChild<SheetView>();
Selection selection = sv.GetFirstChild<Selection>();
Pane pane = new Pane(){ VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };
sv.InsertBefore(pane,selection);
selection.Pane = PaneValues.BottomLeft;

我將它添加到我的程序中,它似乎可以解決問題。

您也可以添加選擇:

WorkbookPart wbp = doc.WorkbookPart;
WorksheetPart wsp = wbp.WorksheetParts.First(); 

SheetViews sheetViews = wsp.Worksheet.GetFirstChild<SheetViews>();
SheetView sheetView = sheetViews.GetFirstChild<SheetView>();

Selection selection1 = new Selection() { Pane = PaneValues.BottomLeft };

Pane pane1 = new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };

sheetView.Append(pane1);
sheetView.Append(selection1);

當我使用其他答案中提供的代碼時,我一直收到 SheetView 的 null 錯誤。 我使用 SDK 生產力工具查看帶有凍結窗格的 excel 文檔的代碼,這幫助我創建了以下代碼。 我沒有使用 GetFirstChild 方法,而是必須創建 SheetViews 和 SheetView 類的新實例以及 append 它們。

這是代碼。

WorkbookPart workbookPart = document.AddWorkbookPart();
workbookPart.Workbook = new Workbook();

WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet();

SheetViews sheetViews = new SheetViews();
SheetView sheetView = new SheetView() { TabSelected = true, WorkbookViewId = (UInt32Value)0U };
Pane pane = new Pane() { ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen, TopLeftCell = "A2", VerticalSplit = 1D };
Selection selection = new Selection() { Pane = PaneValues.BottomLeft };
sheetView.Append(pane);
sheetView.Append(selection);
sheetViews.Append(sheetView);
worksheetPart.Worksheet.Append(sheetViews);

一個額外的注意事項是,在創建 SheetView 時,您必須包括 TabSelected 和 WorkbookViewId 值,否則在打開文件時您將收到有關“我們發現...中的某些內容有問題”的錯誤。

此外,對於想要凍結第一列而不是第一行的任何人,這里有一個示例。

var sheetViews = new SheetViews();
var sheetView = new SheetView() { TabSelected = true, WorkbookViewId = (UInt32Value)0U };
var pane = new Pane() { ActivePane = PaneValues.TopRight, HorizontalSplit = 1D, State = PaneStateValues.Frozen, TopLeftCell = "B1" };
var selection = new Selection() { Pane = PaneValues.TopRight };
sheetView.Append(pane);
sheetView.Append(selection);
sheetViews.Append(sheetView);

2021 年 3 月 2 日的反饋:

你只需要在你的生成 class 中添加 Excel 文件的內容,這個:

Pane FrozeShutterLine1= new Pane() { VerticalSplit = 1D, TopLeftCell = "A2", ActivePane = PaneValues.BottomLeft, State = PaneStateValues.Frozen };

這條線確實允許凍結上線的所有百葉窗......

沒有固定百葉窗的電子表格代碼: 在此處輸入圖像描述

帶有固定百葉窗的電子表格代碼: 在此處輸入圖像描述

我分享這個反饋是因為我也搜索了一段時間才知道如何去做。

MemoryStream documentStream = new ();
    SpreadsheetDocument document = SpreadsheetDocument.Create(documentStream, SpreadsheetDocumentType.Workbook);
    WorkbookPart workbookPart = document.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    WorkbookStylesPart stylePart = workbookPart.AddNewPart<WorkbookStylesPart>();
    stylePart.Stylesheet = new ScrapBuyplanStyleSheet().GenerateStyleSheet();
    stylePart.Stylesheet.Save();
    
    WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet();
    
    // Freeze Panes
    SheetViews sheetViews = new ();
    SheetView sheetView = new () {TabSelected = true, WorkbookViewId = (UInt32Value) 0U};
    Pane pane = new ()
    {
        ActivePane = PaneValues.TopRight,
        State = PaneStateValues.Frozen, 
        TopLeftCell = "B1", 
        //VerticalSplit = 1D,
        HorizontalSplit = 1D
    };
    Selection selection = new () {Pane = PaneValues.TopRight};
    sheetView.Append(pane);
    sheetView.Append(selection);
    sheetViews.Append(sheetView);
    worksheetPart.Worksheet.Append(sheetViews);

創建窗格時null指針的解決方案是在添加窗格之前創建工作表

暫無
暫無

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

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