OpenXML从Worksheet获取工作表名称

我正在迭代我的工作表

WorkbookPart wbPart = doc.WorkbookPart; SharedStringTablePart sstPart = wbPart.GetPartsOfType().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)); 

但是工作表和工作表之间的关系是什么? 如何从工作表中获取相应的工作表或工作表名称?

更新:

所以我确实找到并尝试了如何使用OpenXML从excel表中检索Tab名称

但是,sheetName与工作表不匹配。

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

从工作表返回的行与sheetName指示的工作表中的行不对应。 让我试着进一步解释

我的Excel文档中有三个工作表 – 人员,业务,产品(按此顺序)

在该循环的第一次迭代中 – 我从工作表行获取的数据是指产品表数据,但是sheetName表示“People”

该post假设WorkbookPart.WorksheetPartsWorkbook.Sheets集合中的索引重合。 应该寻找的对象是关系id,因为这是包部件通信的范例。

代替:

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

可以将OpenXmlCompositeElement转换为其’集合组件类型:

 var sheets = workbook.Sheets.Cast().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))); 

然后循环遍历部分时,找到当前部分的关系id并将其与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);