【问题标题】:Export data to excel file from Classic ASP failing从经典 ASP 将数据导出到 excel 文件失败
【发布时间】:2009-07-28 19:55:43
【问题描述】:

我正在尝试将记录集导出到 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>

同样,这适用于我的机器。但是当我从生产中执行它时,它会给我以下信息:

Internet Explorer 无法下载 来自 www.mydomain.com 的 MyFile.asp

Internet Explorer 无法打开 这个互联网站点。请求的站点 不可用或不能 成立。请稍后再试。

除了错误之外,还有什么方法可以使其导出而不显示为具有白色背景且没有线条的 HTML,即像真正的 Excel 文件那样?

编辑: 内容类型已根据 Anthony 的回答进行了更正。

日期没有硬编码,允许每天创建多个文件而无需任何用户干预(用户请求)。

我已更新以删除 If Not EOF。我注意到很多长时间运行的连接,也许应用程序周围存在许多此类问题。谢谢你的提示。而且它仍然可以工作,因为没有按照要求的记录集。

编辑 2 我已经解决了列名不正确的问题(哎呀!),现在它可以从生产中正确下载到我的计算机上。我有 Office 2007。但它仍然无法在至少另一台计算机上下载。这台计算机上装有 Office 2000。但是删除标题并允许它溢出它在所有机器上工作的 HTML。

Office 2000 会不会遇到此类问题?

【问题讨论】:

  • 如果您删除与内容类型和处置相关的标头,它是否显示任何记录(生产中)?
  • 在浏览器中的该页面上查看源代码并在此处发布,以了解其中包含的内容。

标签: excel asp-classic export-to-excel


【解决方案1】:

首先是一些家务。

设置 Content-Type 3 次没有什么意义。只需坚持使用 `application\vnd.ms-excel" 即可。

而不是使用“ANSI”作为字符集使用“Windows-1252”。

输出有多大?由于您正在缓冲,您可能会达到 IIS6 的 ASP 缓冲区默认最大值 4MB。

关闭缓冲或弹出配置数据库编辑器并增加应用程序的 AspBufferingLimit 值。

编辑

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

你安装了什么版本的微软办公软件?

【讨论】:

  • 可能会有一些相当大的文件,但我推测不会超过 1 或 2 MB。我还使用不同的字符集对其进行了更新,并删除了不需要的内容类型。虽然仍然是个问题。
  • 虽然您不是找出问题的人(我不知道如何输入),但您确实就该问题提供了一些非常有用的提示。
【解决方案2】:

我看到后脖子上的汗毛都竖起来了:

 today = "_" + Replace(Date,"/","") + "_" + Replace(Time(),":", "")

...这对服务器上的区域设置非常敏感。会不会是一台服务器具有美国日期格式,而另一台服务器具有不同的日期格式?

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

【讨论】:

  • 这里不用担心,所有基于美国的使用。这个应用程序只在我的办公室。但是,是的,我同意相当糟糕。您是否有另一种方法可以更好地工作并且仍能提供预期的输出?
  • 一次一件事 - 我会通过在您的 ASP 代码中硬编码文件名来排除它。安东尼关于内容倾向的权利;我也会解决这个问题。最后,虽然这绝对不是这个问题的原因,但我想说 If Not rs.EOF Then ... End If 弊大于利。如果它碰巧返回一个空列表(这很糟糕),那么所做的就是阻止您关闭记录集。
  • 我已经更新了帖子,感谢 EOF 的提示。我还将尝试对文件名进行硬编码以进行测试。
【解决方案3】:

如果您的输出仅指定用于导出(到 excel),则无需放置 HTML 和 BODY 标记。你可以安全地只写&lt;table&gt;...&lt;/table&gt;

【讨论】:

    【解决方案4】:

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

    Response.Buffer = False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多