OpenXML 从工作表中获取工作表名称

2024-01-31

我像这样迭代我的工作表

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

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

UPDATE:

所以我确实找到并尝试了这个如何使用 OpenXML 从 Excel 工作表中检索选项卡名称 https://stackoverflow.com/questions/7504285/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 指示的工作表中的行不对应。让我尝试进一步解释

我的 Excel 文档中有三个工作表 - 人员、企业、产品(按顺序)

在该循环的第一次迭代中 - 我从工作表行获取的数据引用产品工作表数据,但工作表名称显示“People”


那篇文章做出了错误的假设,即指数WorkbookPart.WorksheetParts and 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并将其与Sheet.Id (as an 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);  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenXML 从工作表中获取工作表名称 的相关文章

随机推荐