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分钟。
那么,还有其他方法可以减少向客户提交报告的“交付”时间吗?
感谢所有回复
答案 0 :(得分:0)
您确实需要让存储过程运行时间缩短。但这本身就是一个完整的问题和答案。
您写出HTML的方法比它需要的慢。基本上,你正在做重复的字符串连接,这很慢。在将其写入Response流之前,请考虑使用StringBuilder构造整个文档。
另一种选择(也许是更好的选择)是尝试免费的Excel Xml Writer库:http://www.carlosag.net/tools/excelxmlwriter/。我没有用它,但我听说过它的好消息。这将(我相信)让您在服务器上编写Excel文件,而无需安装Excel本身。