gpt4 book ai didi

c# - 保存/创建/导出 Excel 工作表时出现 OutOfMemoryException

转载 作者:行者123 更新时间:2023-11-30 16:04:07 25 4
gpt4 key购买 nike

开发环境:

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

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

当我保存超过 150,000 行时

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 时抛出异常。

如何捕捉这个异常?

最佳答案

尝试分批进行:

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

我以这种方式能够保存 100 万行。我使用假数据对其进行了测试,因此可能需要进行一些小的更改/修复。

关于c# - 保存/创建/导出 Excel 工作表时出现 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35693073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com