c# - OpenXML 从工作表中获取工作表名称

标签 c# openxml openxml-sdk

我像这样遍历我的工作表

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是什么关系呢?如何从工作表中获取对应的工作表或工作表名称?

更新:

所以我确实找到并尝试了这个 How to retrieve Tab names from excel sheet using OpenXML

但是工作表名称与工作表不匹配。

 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 文档中有三个工作表 - 人员、企业、产品(按此顺序)

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

最佳答案

该帖子错误地假设 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<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 匹配(作为 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);  

关于c# - OpenXML 从工作表中获取工作表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26668483/

相关文章:

c# - 更改所有管理员壁纸

c# - 在 C#.NET 中使用 USB PS2 手控器

javascript - 单击几次后 ModalPopupExtender 不显示

c# - c#中的表单刷新问题

java - 在 Java 中将枚举作为参数传递给方法?

c# - 使用 OpenXML SDK 2.5 将图片添加到 QuickPart Autotext

silverlight - 如何从 Silverlight 4 应用程序创建 Word 文档?

c# - 替换 OpenXML 中内容控件的文本

c# - 从 Excel 单元格读取十进制值(在 C# 中)

c# - OpenXML SDK2.5(Excel): How to determine if a cell contains a numeric value?