Остановка панелей в документе OpenXml SDK 2.0 для Excel - PullRequest
6 голосов
/ 21 июня 2011

Я создаю книгу Excel с использованием OpenXml и следую за примерами на http://msdn.microsoft.com/en-us/library/cc850837.aspx

Было бы очень полезно, если бы я мог заморозить верхние панели, но я не могу найти способсделай это.Я понимаю, что могу сделать это, если я использую http://closedxml.codeplex.com/, но сейчас я хотел бы придерживаться OpenXml SDK

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 23 июня 2011

Я пытался решить ту же проблему и закончил тем, что открыл Инструмент повышения производительности Open XML SDK 2.0 и использовал функцию 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;

Я добавил это в свою программу, и это, похоже, помогло.

7 голосов
/ 12 апреля 2012

Вы также можете добавить выделение:

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);
1 голос
/ 14 июня 2018

Когда я использовал код, предоставленный в других ответах, я продолжал получать нулевую ошибку для SheetViews.Я использовал Инструменты повышения производительности SDK для просмотра кода для документа Excel с замороженной панелью, что помогло мне создать приведенный ниже код.Вместо использования метода GetFirstChild мне пришлось создать новые экземпляры классов SheetViews и SheetView и добавить их.

Вот код.

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