C# OpenXML从工作表获取工作表名称

C# OpenXML从工作表获取工作表名称,c#,openxml,openxml-sdk,C#,Openxml,Openxml Sdk,我像这样反复浏览我的工作表 WorkbookPart wbPart = doc.WorkbookPart; SharedStringTablePart sstPart = wbPart.GetPartsOfType<SharedStringTablePart>().First(); SharedStringTable sst = sstPart.SharedStringTable; foreach (var wsp in wbPart.WorksheetParts) { W

我像这样反复浏览我的工作表

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")
    {

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

更新:

所以我找到并尝试了这个

但是,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>();
      ...
 }
foreach(wbPart.WorksheetParts中的var wsp)
{
工作表=wsp.工作表;
var sheetName=wbPart.Workbook.subjections().ElementAt(sheetIndex.Name);
var rows=worksheet.subjects();
...
}
从工作表返回的行与sheetName指示的工作表中的行不对应。让我试着进一步解释

我的excel文档中有三个工作表-人员、业务、产品(按顺序排列)


在该循环的第一次迭代中-我从工作表行中获得的数据指的是产品工作表数据,但工作表名称上写着“人员”

,这篇文章错误地假设
WorkbookPart.WorksheetParts
Workbook.Sheets
集合中的索引重合。应该寻找的匹配是关系id,因为这是包部件通信的范例

而不是:

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)));
还可以使用反向连接,从id获取对象:

public OpenXmlPart OpenXmlContainer.GetPartById (string id);  

我将更新我的原始答案以回应该评论。我强烈建议不要使用开放式XML。速度很慢,api也很糟糕。看看EPPplus项目,我发现它更适合处理Excel。
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); 
}
public OpenXmlPart OpenXmlContainer.GetPartById (string id);