【发布时间】:2014-10-07 13:48:36
【问题描述】:
Public Function GenerateReportAsExcel()
Dim workbook = WorkbookFactory.Create(template)
template.Close()
Dim worksheet = workbook.GetSheetAt(0)
// Writing record to worksheet
Dim workbookStream = New MemoryStream()
workbookStream.Flush()
workbookStream.Position = 0
workbook.Write(workbookStream) //throws error if the rocord is more then 500000...runs fine for 400000
Return New MemoryStream(workbookStream.ToArray())
End Function
WorkbookFactory 正在使用 NPOI.SS.UserModel ....
有没有办法增加内存流容量?我在将 500000 条记录写入 excel 时收到 System.OutOfMemoryException,但最多 400000 条记录工作正常。 我发现了几个类似的问题,但没有得到任何可靠的解决方案...... 有人建议使用
workbookStream.Flush() 工作簿流位置 = 0 但没有任何帮助....
感谢您的关心..
【问题讨论】:
-
我看到发生了一些复制(看起来你最终在内存中有 3 个副本 - 来自工厂的副本,你放在第一个内存流中的副本,然后在你排列它时再次复制. 注释掉的中间发生了什么?某些东西创建垃圾的速度比 GC 收集它的速度更快,或者创建了无法收集的垃圾,例如不调用 dispose,或者您正在使用一个内存数据结构,只是没有' t 适合 IIS 允许的空间(很小,例如每个请求 800MB)
-
400000 条记录时 woorkBookstream 有多大(又名 Length 属性)?
-
请稍等,让我检查一下...
-
@MatthewMartin Dim masterRow = worksheet.CreateRow(RowMasterId) masterRow.CreateCell(ColumnOneCriteria, CellType.STRING).SetCellValue(masterName)....这就是我向工作表添加列的方式..我正在添加至少 80 个这样的列...
-
我猜测 excel 文档是由一个完全在内存中的数据结构表示的。这发生在完全保存在内存中的数据集、XML 和任何其他大数据结构中。就像您创建了一堆 1GB 字符串一样,最终您没有足够的空间将其保存在内存中。然后您必须切换到流式 API,以确保您永远不会在内存中拥有整个对象图。
标签: asp.net-mvc vb.net excel out-of-memory memorystream