向客户端发送Excel报告的大量数据

时间:2013-02-27 23:34:29

标签: asp.net

MS VS 2008,ASp.Net 3.5。 在客户端: 客户选择开始和结束日期,报告格式为Excel,单击“运行报告”按钮 在该单击上重定向到reportToExcel.aspx,在Page_Load事件中的reportToExcel.aspx.vb中执行存储过程以检索报告数据:

oSQLDataReader = oSqlCommand.ExecuteReader()

然后:

Response.ContentType = "application/ms-excel"
Response.AddHeader("Content-Disposition", "attachment; filename=" + MyBase.UserSession.ReportName + ".xls")

然后,Response.Write用于将检索到的报告数据以XML格式写入Response对象,如

Response.Write("<td>" & FormatColumnValue(oSQLDataReader.GetValue(I), arrColHeader(I + 1).ColumnFormat) & "</td>"), etc.  Last callis Response.End().

我知道不应该使用Response.End,我打算用

代替
context.Response.Flush()
context.ApplicationInstance.CompleteRequest()

但我怀疑它会缩短响应时间。

问题:在客户端需要6分钟才能接收32.5 MB的数据。这太长了。 如何减少这段时间?

据我所知到目前为止:Excel报告无法进行chuncking,无论如何客户希望将Excel报告作为一个整体接收。 为了使用Response.TransferFile:首先必须创建Excel文件,然后压缩以减少要下载的数据量,然后下载。为此,Excel应该安装在服务器上,在我们的例子中是不可接受的。

将数据作为csv提供给客户端是不可接受的:客户端必须将其导入Excel,而他们不愿意这样做。

从SQL管理工作室执行的存储过程显示不一致的运行时间:从12秒到4分钟。

那么,还有其他方法可以减少向客户提交报告的“交付”时间吗?

感谢所有回复

1 个答案:

答案 0 :(得分:0)

您确实需要让存储过程运行时间缩短。但这本身就是一个完整的问题和答案。

您写出HTML的方法比它需要的慢。基本上,你正在做重复的字符串连接,这很慢。在将其写入Response流之前,请考虑使用StringBuilder构造整个文档。

另一种选择(也许是更好的选择)是尝试免费的Excel Xml Writer库:http://www.carlosag.net/tools/excelxmlwriter/。我没有用它,但我听说过它的好消息。这将(我相信)让您在服务器上编写Excel文件,而无需安装Excel本身。