打开XML SDK 2.0以按名称访问excel 2010工作表

我有一个Excel 2010电子表格,其中包含3个名为Sheet1,Sheet2和Sheet3的工作表。

我正在尝试按名称获取对工作表的引用。

我正在使用代码:

using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(FileName, true)) { //Access the main Workbook part, which contains all references WorkbookPart workbookPart = myWorkbook.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last(); // this gives me Sheet1 SheetData sheetData = worksheetPart.Worksheet.GetFirstChild(); } 

我试图获得Sheet2的引用,但我找不到这样做的方法。

我越来越近了,但我还没到那里:

 var x = workbookPart.Workbook.Sheets.Where(s=> s.GetAttribute("name", "").Value == "Sheet2").FirstOrDefault(); 

这让我得到了工作表的参考,但没有给工作表上的数据

谢谢

你真正想要的是WorksheetPart ,它包含你正在寻找的SheetData 。 抓取Workbook下的Sheets只会为您提供有关工作表的某些元数据。 这是一个关于如何获取WorksheetPart的示例(随意添加错误检查,因为我认为通过调用First而不是FirstOrDefault已经存在FirstOrDefault

 public WorksheetPart GetWorksheetPart(WorkbookPart workbookPart, string sheetName) { string relId = workbookPart.Workbook.Descendants().First(s => sheetName.Equals(s.Name)).Id; return (WorksheetPart)workbookPart.GetPartById(relId); } 

然后只需使用上面的代码来获取正确的SheetData引用,您就可以从那里找到所需的数据。

下面是一些代码,用于处理具有特定制表符或工作表名称的电子表格,并将其转储为CSV格式。 (我选择了一个管道而不是逗号)。

我希望从单元格中获取值更容易,但我认为这是我们所坚持的。 您可以看到我参考了MSDN文档,其中包含了大部分代码。 这是微软推荐的。

  ///  /// Got code from: https://msdn.microsoft.com/en-us/library/office/gg575571.aspx ///  [Test] public void WriteOutExcelFile() { var fileName = "ExcelFiles\\File_With_Many_Tabs.xlsx"; var sheetName = "Submission Form"; // Existing tab name. using (var document = SpreadsheetDocument.Open(fileName, isEditable: false)) { var workbookPart = document.WorkbookPart; var sheet = workbookPart.Workbook.Descendants().FirstOrDefault(s => s.Name == sheetName); var worksheetPart = (WorksheetPart)(workbookPart.GetPartById(sheet.Id)); var sheetData = worksheetPart.Worksheet.Elements().First(); foreach (var row in sheetData.Elements()) { foreach (var cell in row.Elements()) { Console.Write("|" + GetCellValue(cell, workbookPart)); } Console.Write("\n"); } } } ///  /// Got code from: https://msdn.microsoft.com/en-us/library/office/hh298534.aspx ///  ///  ///  ///  private string GetCellValue(Cell cell, WorkbookPart workbookPart) { if (cell == null) { return null; } var value = cell.CellFormula != null ? cell.CellValue.InnerText : cell.InnerText.Trim(); // If the cell represents an integer number, you are done. // For dates, this code returns the serialized value that // represents the date. The code handles strings and // Booleans individually. For shared strings, the code // looks up the corresponding value in the shared string // table. For Booleans, the code converts the value into // the words TRUE or FALSE. if (cell.DataType == null) { return value; } switch (cell.DataType.Value) { case CellValues.SharedString: // For shared strings, look up the value in the // shared strings table. var stringTable = workbookPart.GetPartsOfType() .FirstOrDefault(); // If the shared string table is missing, something // is wrong. Return the index that is in // the cell. Otherwise, look up the correct text in // the table. if (stringTable != null) { value = stringTable.SharedStringTable .ElementAt(int.Parse(value)).InnerText; } break; case CellValues.Boolean: switch (value) { case "0": value = "FALSE"; break; default: value = "TRUE"; break; } break; } return value; }