0

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 不应该被使用,我打算用 is with

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

但我怀疑它会改善响应时间。

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

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

将数据以 csv 格式交付给客户是不可接受的:客户必须将其导入 Excel,这是他们不喜欢的。

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

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

谢谢大家的回复

4

1 回答 1

0

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

您写出 HTML 的方法比它需要的要慢。本质上,您正在执行重复的字符串连接,这很慢。考虑在将整个文档写入响应流之前 使用StringBuilder构建整个文档。

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

于 2013-02-28T03:48:22.597 回答