2016-02-29 58 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

那么很难给出一个精确的限制,这取决于列的数量,每个单元中的数据大小,机器规格...... –

相关问题