【问题标题】:Flushing a Gembox Spreadsheet object to a stream while reading from a DataReader从 DataReader 读取时将 Gembox 电子表格对象刷新到流中
【发布时间】:2013-06-18 14:35:43
【问题描述】:

这是场景:

  • 我在 SQL Server 2008 R2 数据库中有大约 40 万条记录,我想将其导出到 XLSX 电子表格。
  • 应用程序是 ASP.NET 4.0 Web 应用程序

我尝试使用带有 ReportViewer 的 DataTable,但由于整个 DataTable 被读入内存,w3wp 进程的内存使用量猛增。

我认为 Gembox 电子表格会更好地处理这种情况,我猜测我可以使用 DataReader 而不是 DataTable,只需将新行写入 Excel 工作簿工作表并将其刷新到 HTTP 流上。 但我在 Gembox 电子表格的任何地方都找不到该功能。有没有人用 Gembox 或任何其他第三方组件实现过类似的东西?

【问题讨论】:

  • 将 400k 记录分成更小的块是否有意义,比如说 10k。这样你就不会遇到内存问题。
  • 这是有道理的,但是这对于 ReportViewer 是不可行的,因为我最终必须将所有内容都推送到 DataTable 中,这会破坏您建议的实现。这同样适用于 Gembox。

标签: asp.net memory-management gembox-spreadsheet


【解决方案1】:

我只是在这里猜测,但您应该能够使用 SQLDataReader 来做到这一点。 SQL DataReader 与 SQL DataSet 不同。前者一次检索一条记录,并且需要与数据库的实时连接。我认为它不应该造成内存问题。后者立即检索整个表,这可以使内存使用量猛增。这是微软的一篇好文章,difference between datareader and dataset

另请注意,Excel 也有限制。顺便说一句,Excel 2007 相当不错,可以处理 1000k x 16k 记录。旧版本的 Excel 肯定更受限制。 Excel 2007 Limitation

我也在想如果 Excel 能处理这么大的文件,你的程序应该能处理 40 万条记录。我知道这是很多数据,但操作系统通常会负责内存管理,除非您正在做一些完全错误的事情。

【讨论】:

  • 如果 ReportViewer 接受 DataReader 作为输入,这将起作用,但看起来它仅适用于 DataSet 和 DataTable AFAIK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多