2014-11-21 93 views
2

我有一個基本的winforms應用程序,用戶可以上傳Excel文件(.xlsx),我想讀取這個文件的內容,所以我使用EPPlus。加載大量的excel數據與EPPlus

問題是,我想加載一個非常大的ex​​cel文件的內容,它有7個選項卡,其中一個選項卡具有多於200k行,另一個選項卡具有70k。其他5個總共約50k。 (最終目標)由於我想導入數據,讀取數據,並且根據我有的規則/數據,我需要將數據寫回到Excel中文件並將其導出。

雖然在EPPlus中實現數據加載,但我遇到了問題。

這裏是代碼

var file = new FileInfo(filePath); 
using (var package = new ExcelPackage(file)) 
{ 
    try 
    { 
     // Get the work book in the file 
     ExcelWorkbook workBook = package.Workbook; //Hangs here for about 2 mins 
     if (workBook != null) 
     { 
      if (workBook.Worksheets.Count > 0) 
      { 
       // Get the first worksheet 
       ExcelWorksheet currentWorksheet = workBook.Worksheets.First(); 
       // gets the currentWorksheet but doesn't evaluate anything... 

      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

代碼掛在package.workbook線大致2分鐘。然後它進入如果獲得currentWorkSheet的地方,並且如果我查看手錶中的該變量的內容,則由於它顯示了以下內容,因此沒有任何內容被真正加載:

功能評估被禁用,因爲之前的功能評估超時。您必須繼續執行才能重新啓用功能評估。

我從EPPlus看了link,它顯示加載大文件時唯一的問題是從上到下和從左到右的負載,他們說5000多。我有更多的方式,所以我只是想知道EPPlus是否可以做到這一點?

此外,我已經做了一些谷歌搜索和大多數的問題是,他們可以在本地,他們無法打開服務器上的大型Excel文件...

我也開始看的Open XML SDK,它似乎要更好地表現明智,但也更難以使用代碼明智。

+2

它永遠不會讓我驚訝爲什麼人們想使用Excel,就好像它是一個實際的數據庫..你看過MSDN的大小限制,關於Excel也有你應該考慮OpenXML難代碼明智或不..有很多工作OpenXML的例子,你只需要花點時間開始工作,並試圖獲得一些基本的東西'從一個較小的子集'開始' – MethodMan 2014-11-21 17:50:32

+1

這不是我的工作,使用Excel。我只是拿起一個項目而已。我從來沒有使用過Excel作爲數據庫。但是,關於我的回答,使用EPPlus確實可以用於我打算使用它的目的。我只是以不恰當的方式訪問單元格。另外,我對Open XML的含義是(從我的觀點來看),與EPPlus相比,編碼看起來有點困難。再說一遍,我也不是很熟悉,所以我不知道。我是否需要走這條路,我會了解到。 – Robin 2014-11-21 18:04:48

+1

如果您對文件的生成方式有任何控制,並且工作簿本質上是平面文件,即不涉及函數/宏/格式,只需要數據轉儲,那麼最好使用幾個單獨的.csv文件而不是帶有單獨工作簿的excel文件。否則,@DJKRAZE提出敲定OpenXML解決方案的方法就是解決這個問題的方法。 – 2014-11-21 18:06:12

回答

3

喜歡漂亮的大數據集的那些聲音,所以你可能需要閱讀此:

EPPlus Large Dataset Issue with Out of Memory Exception

基本上,你可以用「較大」數據集運行的RAM。但它不僅僅是增加大小的行數,還包括列和每個單元格的內容。字符串通常會佔用比數字更多的空間,因此有時難以預測EPP何時會出現內存問題。有傳聞說EPP的最新版本更好,但我沒有自己測試過。

似乎你得到它的工作基於您的意見,這很好,但記住的內存限制。我同意你的意見 - 在Open XML中做這件事不是一個簡單的練習。

+0

感謝你們,幸運的是我確實發現了問題並能夠解決問題,但我會牢記這一點。謝謝! – Robin 2014-11-21 18:37:21

+0

是否有可能通過使用類似於Linq的'Skip(x)'和'Take(x)'方法加載和處理文件塊來解決內存限制問題,或者是否將整個工作簿加載到內存中? – 2014-11-21 18:37:32

+0

@丹斯。我試過了(可能在我的回覆中提到過它)。沒有運氣 - 一旦您在EPP中打開文件,無論如何它都會被加載。就像我說的,也許他們在最新的版本中發現它仍然處於測試階段 - 如果它們確實如此,它們會很好。 – Ernie 2014-11-21 19:12:15