2016-02-29 59 views
3

開發環境:OutOfMemoryException異常,同時節省/創建/導出excel表

  • OS - Windows 7的64位
  • CPU - 睿i5 460M
  • RAM - 8GB
  • .NET框架 - 4.0
  • Excel-Interop - Microsoft Excel 14.0對象庫

我正在使用Excel-Interop導出excel文件DataGridView(dgv)。

當我節省超過15萬行

OutOfMemoryException異常

更被拋出。

{ 
    object[,] valueObjArray = new object[rowCnt, colCnt]; 
    int rowCnt = dgv.Rows.Count; 
    int colCnt = dgv.Columns.Count; 

    for (int rowIndex = 0; rowIndex < rowCnt; rowIndex++) 
    { 
     for (int colIndex = 0; colIndex < colCnt; colIndex++) 
     { 
      valueObjArray[rowIndex, colIndex] = dgv[colIndex, rowIndex].Value; 
     } 
    } 

    _workSheet.get_Range("A1", Convert.ToChar(colCnt + 64).ToString() + "1").Value2 = headerObjArray;     
    _workSheet.get_Range("A2", Convert.ToChar(colCnt + 64).ToString() + (rowCnt + 1).ToString()).Value2 = valueObjArray; 
    _workSheet.get_Range("B2", "B" + (rowCnt+1).ToString()).NumberFormat = "yyyy-mm-dd hh:mm"; 

    _workBook.SaveAs(path); 
} 

這是加速我知道的最好方法。

但是,監視RAM後,我認爲它會導致內存增加。內存使用量達到900Mb左右時會引發異常。

如何捕獲此異常?

+1

@Trix感謝您的編輯:D –

+0

我已經最後保存了258927行,最後是15列。導出的文件大小爲24.2MB,內存使用量約爲600Mb。 –

+0

在這個問題中,你寫道你有150,00行有問題。它不到258,927。 –

回答

3

嘗試做分批:

//We will call SaveAs method many times and we don't want to be asked 
//if a file should be overwritten every time. 
xlApp.DisplayAlerts = false 

int rowCnt = dgv.Rows.Count; 
int colCnt = dgv.Columns.Count; 

int batchSize = 100000; //Try to experiment with other values 
int currentRow = 0; 

object[,] valueObjArray = new object[batchSize, colCnt]; 

_workSheet.get_Range("A1", Convert.ToChar(colCnt + 64).ToString() + "1").Value2 = headerObjArray;  

while (currentRow < rowCnt) 
{ 
    for (int rowIndex = 0; rowIndex < batchSize && currentRow + rowIndex < rowCnt; rowIndex++) 
    { 
     for (int colIndex = 0; colIndex < colCnt; colIndex++) 
     { 
      valueObjArray[rowIndex, colIndex] =    
      dgv[colIndex, currentRow + rowIndex].Value; 
     } 
    } 

    ws.get_Range("A2", Convert.ToChar(colCnt + 64).ToString() + (currentRow + batchSize + 1).ToString()).Value2 = valueObjArray; 
    ws.get_Range("B2", "B" + (currentRow + batchSize + 1).ToString()).NumberFormat = "yyyy-mm-dd hh:mm"; 

    wb.SaveAs("a.xlsx"); 

    currentRow += batchSize; 
} 

我能夠保存這樣一個百萬行。我用假數據對它進行了測試,因此可能需要一些小的更改/修復。

+0

感謝您的回答!它工作正常。但是,我必須使用批處理意味着存在容量限制。我知道限制在哪裏嗎? –

+0

那麼很難給出一個精確的限制,這取決於列的數量,每個單元中的數據大小,機器規格...... –

相關問題