2016-04-01 76 views
0

我有一個場景,我需要在MVC應用程序中讀取Excel文件,我需要這個在服務器上運行,因此我使用Open XML,我有一個問題,我的代碼沒有進入工作表中的行循環,請參閱下面的代碼和關於如何糾正我的代碼的建議。打開XML閱讀Excel文件不進入循環讀取Excel表

if (file.ContentLength > 0) 
{ 
    string path = file.FileName;  
    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(path, false)) 
    { 
     WorkbookPart workbookPart = doc.WorkbookPart; 
     WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); 
     SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); 

     foreach (Row r in sheetData.Elements<Row>()) 
     { 
      foreach (Cell c in r.Elements<Cell>()) 
      { 
       string text = c.CellValue.Text; 
      } 
     } 
    } 
} 

任何想法,您的幫助將不勝感激,我一直在努力接近多,但我不是在foreach循環FR一些奇怪的原因得到。

我正在使用Excel 2013,請參閱下面的圖像我的工作簿。

Here is my Excel sheet template

回答

1

我一直在使用下面的代碼這對我來說工作正常。

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(sFileNameWithPath, false)) 
{ 
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart; 
    WorksheetPart worksheetPart = GetWorksheetPart(workbookPart, sSheetName); 

    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); 

    bool bHasChildren = sheetData.HasChildren; 
    if (bHasChildren) 
    { 
     for (int iCounter1 = 1; iCounter1 < sheetData.Elements<Row>().Count(); iCounter1++) 
     { 
      Row rDataRow = sheetData.Elements<Row>().ElementAt(iCounter1); 
      for (int iCounter = 0; iCounter < rDataRow.ChildElements.Count; iCounter++) 
      { 
       Cell oCell = (Cell)rDataRow.ChildElements[iCounter]; 
      } 
     } 
    } 
} 

讓我知道這是否有幫助。

或者你可以使用你的代碼如下變化,我已經使用了Excel工作表名稱「索賠」

using (SpreadsheetDocument doc = SpreadsheetDocument.Open(sFileNameWithPath, false)) 
{ 
    WorkbookPart workbookPart = doc.WorkbookPart; 

    string relId = workbookPart.Workbook.Descendants<Sheet>().First(s => "Claims".Equals(s.Name)).Id; 
    WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(relId); 

    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); 

    foreach (Row r in sheetData.Elements<Row>()) 
    { 
     foreach (Cell c in r.Elements<Cell>()) 
     { 
      string text = c.CellValue.Text; 
     } 
    } 
} 

注意,所以檢查它是否有效,如果是,把它放在另一個函數中使其具有通用性

+0

它仍然不能正常工作,它不會進入for循環,還有GetWorksheetPart(workbookPart,sSheetName)的位置;方法定義?我嘗試了很多不同的方法,沒有運氣。 HasChildrenSheets回退false,因此它跳過循環,如果我刪除HasChildrenSheets代碼,它會輸入表達式而不是循環中的代碼 – Papi

+0

該函數不算什麼,但返回工作表私有靜態WorksheetPart GetWorksheetPart(WorkbookPart工作簿部分,字符串表名) { string relId = workbookPart.Workbook.Descendants ().First(s => sheetName.Equals(s.Name)).Id; return(WorksheetPart)workbookPart.GetPartById(relId); } – A3006

+0

我還在爲進入循環作鬥爭,我不知道爲什麼 – Papi