【发布时间】:2017-02-23 17:39:51
【问题描述】:
我正在使用 EPPlus 将我的 datagridview 数据传输到 excel 文件,我的问题是进程正在消耗内存,我缺少什么来释放已用的内存?在外面,几千行看起来还不错,但是程序使用的内存会增加,并且在导出并保存到 Excel 后不会回落。现在,当我尝试导出一百万行时,内存不足。
这是我的代码,这个进程在后台工作人员上运行。
Using p = New ExcelPackage
Dim sheetnum As Integer = 2
Dim ws As ExcelWorksheet = CreateSheet(p, "report")
For Each dgcol As DataGridViewColumn In dg.Columns
ws.Cells(1, col).Value = dgcol.HeaderText
col += 1
Next
For Each rowx As DataGridViewRow In dg.Rows
For Each colx As DataGridViewColumn In dg.Columns
ws.Cells(row, colx.Index + 1).Value = dg.Rows(rowx.Index).Cells(colx.Index).Value
Next
row += 1
BackgroundWorker1.ReportProgress(CInt(100 * Integer.Parse(rowx.Index + 1) / dg.Rows.Count), CInt(100 * Integer.Parse(rowx.Index + 1) / dg.Rows.Count))
If row = 1048577 Then 'Check if max rows have been reached and create a new sheet
ws = CreateSheet(p, "report" & sheetnum)
sheetnum += 1
row = 2
col = 1
For Each dgcol As DataGridViewColumn In dg.Columns
ws.Cells(1, col).Value = dgcol.HeaderText
col += 1
Next
End If
Next
Dim bin() As Byte = p.GetAsByteArray()
File.WriteAllBytes(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & "report.xlsx", bin)
End Using
【问题讨论】:
-
你需要在处理完
ExcelWorksheet之后处理它。 -
@RezaAghaei 感谢您的建议,但没有奏效。
-
我不确定它是否能解决整个问题,但是如果你看一下
ExcelWorksheet类的Dispose方法的实现,你会看到代码释放了很多资源并且可能代码的作者比我们更清楚需要释放哪些资源。 -
@RezaAghaei 我不知道它应该有多大帮助,但它做了一些事情,但没有我预期的那么多,我尝试导出大约 13000 行,我的程序使用了大约 40mb 的内存,当我开始导出过程,它跳到 75mb,没有 dispose 命令它停留在那里,使用 dispose 命令它下降到 68-70mb,我预计它会回到 40mb 左右。无论如何,如果我导出一百万行,这仍然不会为我提供内存不足的解决方案。谢谢。
-
查看一些关于 EPPlus 内存使用情况的链接,例如 this。
标签: excel vb.net winforms datagridview epplus