【问题标题】:Open XML SDK 2.0 to get access to excel 2010 worksheet by name打开 XML SDK 2.0 以按名称访问 excel 2010 工作表
【发布时间】:2012-01-11 02:14:38
【问题描述】:

我有一个 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<SheetData>();
}

我正在尝试获取对 Sheet2 的引用,但我找不到执行此操作的方法。

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

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

这让我得到了对工作表的引用,但不是对工作表上的数据的引用

谢谢

【问题讨论】:

    标签: c# openxml openxml-sdk excel-2010


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      下面是一些代码,用于处理具有特定选项卡或工作表名称的电子表格并将其转储到 CSV 之类的文件中。 (我选择了竖线而不是逗号)。

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

          /// <summary>
          /// Got code from: https://msdn.microsoft.com/en-us/library/office/gg575571.aspx
          /// </summary>
          [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<Sheet>().FirstOrDefault(s => s.Name == sheetName);
                  var worksheetPart = (WorksheetPart)(workbookPart.GetPartById(sheet.Id));
                  var sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
      
                  foreach (var row in sheetData.Elements<Row>())
                  {
                      foreach (var cell in row.Elements<Cell>())
                      {
                          Console.Write("|" + GetCellValue(cell, workbookPart));
                      }
                      Console.Write("\n");
                  }
              }
          }
      
          /// <summary>
          /// Got code from: https://msdn.microsoft.com/en-us/library/office/hh298534.aspx
          /// </summary>
          /// <param name="cell"></param>
          /// <param name="workbookPart"></param>
          /// <returns></returns>
          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<SharedStringTablePart>()
                              .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;
          }
      

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多