[英]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);
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.