2016-04-01 74 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