我像这样遍历我的工作表
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.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 并将其与 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/