2012-01-11 43 views
12

Tôi có bảng tính Excel 2010 có 3 trang tính có tên Sheet1, Sheet2 và Sheet3.Mở XML SDK 2.0 để truy cập vào trang tính excel 2010 theo tên

Tôi đang cố gắng tham chiếu đến trang tính theo tên.

Tôi đang sử dụng mã:

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

tôi đang cố gắng để có được một tài liệu tham khảo để Sheet2, nhưng tôi không thể tìm thấy một cách để làm điều này.

tôi nhận được gần hơn, nhưng tôi không có được nêu ra:

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

Đó được tôi một tham chiếu đến bảng, nhưng không phải với các dữ liệu trên bảng

Cảm ơn

Trả lời

21

Những gì bạn thực sự muốn là WorksheetPart đó là những gì có chứa các SheetData mà bạn đang tìm kiếm. Việc lấy Sheets dưới Workbook sẽ chỉ cung cấp cho bạn siêu dữ liệu nhất định về các trang tính. Dưới đây là một ví dụ về cách lấy mà WorksheetPart (cảm thấy tự do để thêm kiểm tra lỗi như bạn thấy phù hợp như tôi giả định sheetName đã tồn tại bằng cách gọi First và không 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); 
} 

Sau đó, chỉ cần sử dụng mã của bạn ở trên để lấy tham chiếu SheetData chính xác và bạn sẽ có thể tìm thấy dữ liệu bạn muốn từ đó.

+0

Cảm ơn amurra !! –

3

Dưới đây là một số mã để xử lý bảng tính với tên tab hoặc trang tính cụ thể và đổ nó vào một cái gì đó như CSV. (Tôi đã chọn một đường ống thay vì dấu phẩy).

Tôi ước rằng việc lấy giá trị từ một ô trở nên dễ dàng hơn, nhưng tôi nghĩ đây là những gì chúng ta đang mắc phải. Bạn có thể thấy rằng tôi tham khảo các tài liệu MSDN nơi tôi nhận được hầu hết các mã này. Đó là những gì Microsoft khuyến cáo.

/// <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; 
    } 
Các vấn đề liên quan