2014-11-27 3 views
2

Каждый лист Excel имеет имя SheetName (имя отображается пользователю) и Codename (внутреннее неизменяемое имя, которое не видно пользователю), см. Рисунок ниже. Мне нужно получить рабочий лист по его кодовому имени, а не по его имени SheetName. Причина в том, что если пользователь меняет имя SheetName, мой фактический код больше не будет работать.Получение рабочего листа по его кодовому названию

Это работает до тех пор, как Suer не изменит SheetName «Sales» на что-то другое:

var myworksheet = Worksheet("Sales"); 

мне нужно гипотетическую функцию WorksheetByCodeName, так что я мог бы написать это (который будет работать также, если пользователь изменил SheetName от «Продажи» на что-то другое:

var myworksheet = WorksheetByCodeName("Sheet1"); 

Это изображение только для иллюстрации вопрос не имеет никакого отношения к VBA

.. enter image description here

More information about worksheet codenames

ответ

2

Вы не можете сделать это в ClosedXML. Но вы можете использовать OpenXML (который у вас уже есть как требование для ClosedXML):

static string GetWorksheetNameForCodeName(string filename, string codename) 
{ 
    DocumentFormat.OpenXml.Packaging.WorksheetPart wsp = SpreadsheetDocument 
     .Open(filename, false).WorkbookPart.WorksheetParts 
     .SingleOrDefault(ws => ws.Worksheet.SheetProperties.CodeName == codename); 

    return wsp == null ? string.Empty : wsp.Worksheet.SheetProperties.LocalName; 
} 
+0

Это должно быть возможно с помощью ClosedXML. Я отправлю запрос на https://closedxml.codeplex.com. Спасибо большое. –

+0

Прошу прощения, чтобы ответить на мой ответ, но это всегда возвращает строку «sheetpr» вместо фактического имени листа. –

Смежные вопросы