【问题标题】:Transferring datagridview data to excel将datagridview数据传输到excel
【发布时间】: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


【解决方案1】:

由于它被封装在 using 块中,因此 ExcelPackage 对象被正确处理。您说您还处置了 cmets 中的 ExcelWorksheet 对象,但没有成功。

但是,我认为您没有在最后一行代码(End Using 之前)中处理写入文件的字节数组

试试看。希望对您有所帮助。

【讨论】:

猜你喜欢
  • 2016-10-13
  • 2020-03-12
  • 2023-03-21
  • 2013-09-11
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多