【问题标题】:Write as building table in HttpHandler?在 HttpHandler 中写为构建表?
【发布时间】:2012-11-01 09:26:40
【问题描述】:

我必须将非常大的文件导出为“excel 导出”。由于 .NET 无法导出 excel 文件,所以我使用了简单的 html 表格。

它工作正常,但速度很慢。

是否可以在创建每一行时对其进行 context.response.write,而不是构建一些超大的字符串并在完成后尝试导出整个内容?

我不太关心使用什么函数来执行此操作,但我希望你知道我的意思。我不想将一个字符串构建到内存中,然后尝试一次全部发送。我宁愿在建表时导出。

这可能吗?

提前致谢!

【问题讨论】:

  • 目前尚不清楚您的问题是什么:有人强迫您“将字符串构建到内存中”并且您需要帮助吗?旁注:“.Net 无法导出 E​​xcel 文件”是有问题的陈述......所以不要在此基础上建立过多的推理。
  • 感谢您的帮助!我发现导出真正的蓝色 excel 文件的唯一方法是使用 Microsoft.Office.Interop.Excel。文档建议不要这样做,并说如果大规模使用它会导致“系统不稳定”。目前,我正在从数据库数据构建一个大字符串。我不想构建一个大字符串并在完成后发送结果,而是希望在构建每一行时将它们发送给客户端。这可能吗?

标签: c# memory-leaks httphandler export-to-excel large-files


【解决方案1】:

是的,在每一行上使用 context.Response.Write 就可以了。如果不想构建大字符串的原因是服务器内存使用,那么您需要像这样关闭响应缓冲:

context.Response.BufferOutput = false;

否则,无论如何,.NET 只会将您的写入缓冲到内存中直到结束。

如果原因是执行时间,那么您可能会遇到来自多个字符串连接的性能影响。在这种情况下,您可以改用 StringBuilder 类来构造表。

例如...

StringBuilder sb = new StringBuilder();
for each (<row in database>) {
    sb.AppendLine(<current table row>);
}
context.Response.Write(sb.ToString());

有关响应缓冲的更多信息: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.bufferoutput.aspx

有关 StringBuilder 类的更多信息: http://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx

【讨论】:

  • 这正是我要说的!谢谢!
  • 非常感谢您的缓冲输出设置!
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
相关资源
最近更新 更多