OutOfMemoryException当保存/创build/导出excel工作表

开发环境:

  • 操作系统 – Windows 7 64位
  • CPU – i5 460M
  • 内存 – 8GB
  • .NET框架 – 4.0
  • Excel-Interop – Microsoft Excel 14.0对象库

我正在使用Excel-InteropDataGridView (dgv)导出excel文件。

当我保存超过约150,000行

OutOfMemoryExceptionexception

被抛出。

{ 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时引发exception。

我如何捕捉这个例外?

试着分批做:

 //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; } 

我可以用这种方式节省一百万行。 我用假数据testing了它,所以可能需要修改一些小的修改。