2014-10-31 4 views
2

я итерация моих рабочих листов, как такOpenXML получить имя листа из рабочего листа

WorkbookPart wbPart = doc.WorkbookPart; 
SharedStringTablePart sstPart = wbPart.GetPartsOfType<SharedStringTablePart>().First(); 
SharedStringTable sst = sstPart.SharedStringTable; 

foreach (var wsp in wbPart.WorksheetParts) 
{ 
    Worksheet ws = wsp.Worksheet; 

    // i want to do something like this 
    if (ws.Name == "People_Sheet") 
    { 

    } 
} 

мне нужно знать, какой лист я буду обрабатывать, так что я могу справиться с этим по-разному. Как я могу получить имя листа (которое отображается, когда я его открываю в excel)?

Если я получаю список листов я могу найти его с помощью атрибутов

doc.WorkbookPart.Workbook.Sheets.ToList().ForEach(x => Console.WriteLine(x.GetAttribute("name", "").Value)); 

Но какова связь между листом и рабочим листом? Как я могу получить соответствующее имя листа или листа из листа?

UPDATE:

Так что я нашел и попробовать этот How to retrieve Tab names from excel sheet using OpenXML

Однако SheetName не совпасть с листа.

foreach (var wsp in wbPart.WorksheetParts) 
{ 
     Worksheet worksheet = wsp.Worksheet; 
     var sheetName = wbPart.Workbook.Descendants<Sheet>().ElementAt(sheetIndex).Name; 
     var rows = worksheet.Descendants<Row>(); 
     ... 
} 

Строки, которые возвращаются из рабочего листа не соответствует строкам, которые находятся в листе, обозначенном SheetName. Позволь мне объяснить дальнейший

У меня есть три листа в моем первенствовать документ - люди, предприятие, товары (в таком порядке)

В первой итерации этого цикла - данные я получаю от рабочего листа строк относятся к продуктам данные листа, но sheetName говорит «Люди»

+2

возможно дубликат [Как получить имена из Tab первенствовать листа, используя OpenXML] (http://stackoverflow.com/questions/7504285/ how-to-retrieve-tab-names-from-excel-sheet-using-openxml) – wolfgangwalther

+0

Я обновлю свой первоначальный ответ, чтобы ответить на этот комментарий. – rocklobster

+0

Я бы не рекомендовал использовать Open XML. Это медленно, и api ужасно. Взгляните на проект EPPplus, который я считаю намного лучше для работы с Excel. http://epplus.codeplex.com/ –

ответ

7

Это сообщение делает ложное предположение о том, что индексы в коллекциях WorkbookPart.WorksheetParts и Workbook.Sheets совпадают. Для соответствия нужно искать идентификатор отношения, так как это парадигма коммуникации части пакета.

Вместо:

var workbook = doc.WorkbookPart.Workbook; 
workbook.Sheets.ToList().ForEach(x => Console.WriteLine(x.GetAttribute("name", "").Value)); 

один мог бросить OpenXmlCompositeElement его типа компонента коллекции:

var sheets = workbook.Sheets.Cast<Sheet>().ToList(); 
sheets.ForEach(x => Console.WriteLine(
     String.Format("RelationshipId:{0}\n SheetName:{1}\n SheetId:{2}" 
     , x.Id.Value, x.Name.Value, x.SheetId.Value))); 

Затем, когда цикл по частям, найти отношения идентификатор текущей части и соответствуют его против Sheet.Id (в качестве OpenXmlLeafElement):

foreach (var w in doc.WorkbookPart.WorksheetParts) 
{ 
    string partRelationshipId = doc.WorkbookPart.GetIdOfPart(w); 
    var correspondingSheet = sheets.FirstOrDefault(
     s => s.Id.HasValue && s.Id.Value == partRelationshipId); 
    Debug.Assert(correspondingSheet != null); 
} 

Кроме того, обратная связь доступна, получить объект из ID:

public OpenXmlPart OpenXmlContainer.GetPartById (string id); 
Смежные вопросы