从经典 ASP 导出数据到 Excel 文件失败

3

我试图将一个记录集导出到Excel中,但它似乎在生产服务器上无法正常工作。然而,在我的开发工作站上却可以正常工作。我想知道是否是服务器相关的问题,但我有其他应用程序可以使用完全相同的代码(或类似代码)和设置正常导出。

<%@ Language=VBScript %>
<%Response.expires = -1%>
<%response.buffer = true%>
<%
     Dim today 
     today = "_" + Replace(Date,"/","") + "_" + Replace(Time(),":", "")

     Response.Charset = "ANSI"
     Response.ContentType = "application/octet-stream"
     Response.ContentType = "application/vnd.ms-excel"
     Response.AddHeader "Content-Disposition", "attachment; filename=List" + today + ".xls" 
     Response.ContentType = "application/download"

     set Cnn = server.CreateObject("ADODB.connection")
     Cnn.ConnectionString = Application("Cnn_ConnectionString")
     Cnn.open      

     set rs1 = server.CreateObject("ADODB.Recordset") 
     SQLCollections = "Sp_MysProc @Param1=" & Session("var1")
     rs1.open SQLCollections,cnn
%>
<html>
    <body>
        <table>
            <tr>
                <td>Number</td> 
                <td>Name</td> 
            </tr>
        <%if not rs.eof then
            do while not rs.eof %>
            <tr> 
                <td><%=rs("Number") %></td> 
                <td><%=rs("Name") %></td>   
            </tr>
        <%
            rs.MoveNext
            Loop
           rs.Close
           set rs = Nothing 
         End if        
        %>
        </table>
    </body>
</html>

再次强调,这在我的机器上可行。但当我在生产环境中执行时,将会给我以下信息:

互联网资源无法下载 MyFile.asp 来自 www.mydomain.com

Internet Explorer 不能打开此互联网站点。 请求的站点不可用或无法找到。 请稍后再试。

除了错误之外,是否有办法使它以类似真正的Excel文件的方式进行导出,并且不显示为带有白色背景和无线条的HTML?

编辑: 根据Anthony的回答,内容类型已经得到了纠正。

日期并非硬编码,以便于每天都能创建多个文件,而无需任何用户干预(用户请求)。

我已更新以删除掉If Not EOF。我已经注意到了很多长时间运行的连接,也许应用程序周围存在许多这些类型的问题。感谢提示。即使没有记录集,它仍然有效。

编辑2: 我已经解决了一个列名错误的问题(哎呀!),现在可以从生产环境中正确下载了。我使用的是Office 2007。但是,至少有一台其他计算机仍无法下载。这另一台计算机上安装有Office 2000。但是在删除标题并允许其溢出HTML时,它可以在所有计算机上正常工作。

Office 2000可能会对这种情况有问题吗?


1
如果您删除与内容类型和处理相关的标头,它是否会显示任何记录(在生产中)? - shahkalpesh
在浏览器上查看该页面的源代码,并在此处发布其内容。 - shahkalpesh
4个回答

2

首先需要注意一些事情。

设置Content-Type 3次没有必要,只需使用“application\vnd.ms-excel”即可。

字符集应该使用“Windows-1252”,而不是“ANSI”。

输出的大小是多少?由于你在缓冲区,可能会达到默认最大值4MB的IIS6 ASP缓冲区。

可以关闭缓冲或打开元数据库编辑器并增加应用程序的AspBufferingLimit值。

编辑:

接下来我会尝试在我的客户端上安装Fiddler并尝试下载。您在下载文件时在fiddler中看到了什么?

您安装的MS Office版本是什么?


有可能会出现一些相当大的文件,但我猜测不会超过1或2 MB。我还使用了不同的字符集更新了它,并删除了不必要的内容类型。尽管仍然存在问题。 - Tim Meers
虽然你不是发现问题的人(因为我不知道如何打字),但你确实给了一些非常有用的解决问题的建议。 - Tim Meers

1
当我看到这个时,我的脖子后面的头发都竖了起来:
 today = "_" + Replace(Date,"/","") + "_" + Replace(Time(),":", "")

...这与服务器上的区域设置非常敏感。可能是一个服务器使用美国日期格式,而另一个服务器使用不同的日期格式吗?

如果出现问题,您可能会得到一个无效的文件名。


放心,这里只有基于美国的应用。对于这个应用程序,仅限于我的办公室。但是我同意,效果相当糟糕。您是否有其他方法可以更好地工作并仍然提供预期的输出? - Tim Meers
一次只做一件事 - 我会在你的ASP代码中硬编码文件名来排除它。Anthony关于内容分发的建议是正确的,我也会修复它。最后,虽然这绝对不是问题的原因,但我认为如果不是rs.EOF Then ... End If正在造成更多的伤害而不是好处。所有这些都只是在阻止您关闭记录集,如果它恰好返回一个空列表(这是不好的)。 - Gary McGill
我已经更新了帖子,感谢您关于EOF的提示。我还将尝试为测试硬编码文件名。 - Tim Meers

0

只需使用以下代码在您的代码中禁用缓冲即可。

Response.Buffer = False

0
如果您的输出仅用于导出(到Excel),则无需在周围放置HTML和BODY标记。 您可以安全地只编写<table>...</table>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接