2017-03-13 18 views
0

我有以下擴展方法來讀取Excel文件中的行。但是,excel文件太大(超過500K行和900列),我希望是否無論如何都要讀取部分的excel文件(例如,一次5K行)。如何使用XmlReader讀取零件中的xml?

static IEnumerable<XElement> StreamRows(this OpenXmlPart part) 
    { 
     using (StreamReader stringReader = new StreamReader(part.GetStream())) 
     using (XmlReader xmlReader = XmlReader.Create(stringReader)) 
     { 
      xmlReader.MoveToContent(); 

      while (!xmlReader.EOF) 
      { 
       if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "row") 
       { 
        XElement el = XElement.ReadFrom(xmlReader) as XElement; 
        if (el != null) 
        { 
         yield return el; 
        } 
       } 
       else 
       { 
        xmlReader.Read(); 
       } 
      } 
     } 
    } 

請不要使用「一代產量」我嘗試添加了XElements到列表(每5K行)並返回列表,但花了更多的時間比預期來執行。

我沒有想法和任何幫助表示讚賞。

+0

與該代碼現在應該已經被閱讀的部分(逐行,流式)。你有什麼問題? – Evk

+0

我[這裏回答](http://stackoverflow.com/questions/24829801/reading-a-large-excel-file-by-openxml/24865391#24865391)顯示瞭如何使用OpenXml讀取大型Excel文件。它在VB中,但它很容易轉換。 – petelids

+0

@Evk當前代碼返回所有行(500K)的IEnumerable,當我嘗試迭代時,它需要很長時間。我期望做的是在一個循環中調用這個函數,以便一次讀取5k行。 –

回答

0

嘗試使用ClosedXML。你可以找到這個位置:https://closedxml.codeplex.com/和的NuGet:https://www.nuget.org/packages/ClosedXML/

這個庫完全地支持業務的Excel文檔(2007年版之後,如.XLSX文件)

玩得開心;)

+0

感謝您的幫助Damian。我遇到的問題是我不能使用任何新的庫/包,而必須堅持使用什麼。 :( –

+0

所以試着實現我的變量,並在每個循環中增加這個,然後檢查是否(i> = 500){break;} –