【问题标题】:Opening or downloading an excel file from aspx web page fails: It doesn't open in application从 aspx 网页打开或下载 excel 文件失败:它没有在应用程序中打开
【发布时间】:2021-02-26 07:08:54
【问题描述】:

我们有一个将基于 ActiveReport 的报表转换为 Excel 文件的解决方案。基本上这工作得很好,但在某些环境中,由于某些非常奇怪的原因,Excel 文件的下载没有开始,并且 Excel 文件在 Web 浏览器窗口中打开,而不是询问用户是否要打开或保存生成的 Excel 文件.

我们的应用程序在基于 Windows Server 2019 的虚拟机上运行。但是,如果我从其他计算机连接到该虚拟机上的 Web 服务器并打开相同的应用程序并将相同的报告导出到 Excel 文件中,一切正常。网络浏览器询问我是否要保存或打开 Excel 文档,我可以将其打开到 Excel 或 Excel 查看器。

更奇怪的是,这个问题并没有出现在每个运行相同应用程序的服务器上。看起来,如果服务器上只安装了 Microsoft Office Excel 查看器,就会出现这些问题 - 但并非在所有情况下都如此。如果安装了完整版的 Excel,似乎没有问题。

我们已经尝试了我们发现的一切。我们设置了浏览器标志(https://docs.microsoft.com/en-US/troubleshoot/browsers/how-to-set-ie-to-open-office-documents-in-office-programhttps://www.thewindowsclub.com/make-internet-explorer-open-linked-office-documents-in-the-appropriate-office-program),浏览了几十个网页,重新安装了 Excel Viewer。

不过,这个问题似乎与浏览器标志完全无关,因为即使在注册表项中未设置浏览器标志值,这在其他服务器中也可以正常工作。

所以,对我来说,问题似乎出在服务器上的网络浏览器设置中。我只是无法想象在哪里。服务器上安装的网络浏览器是 IE 11。

非常感谢任何帮助。

编辑:

正如我在评论中解释的那样,我发现,出现此问题的应用程序版本存在差异。

版本之间的区别是:

public static void ReportExport(DataDynamics.ActiveReports.Document.Document doc, 
                ReportExportOptions exportOptions, string exppath, 
                MemoryStream expstream, HttpResponse resp)
{
// For exporting to Response
string contenttype = "";

contenttype = "application/vnd.ms-excel";

// Current version, working.
// Write to Response 

    if (resp != null)
    {
        resp.Clear();
        resp.Charset = "";
        resp.ContentType = contenttype;
        byte[] expArray = expstream.ToArray();
        if (exportOptions.ExportFormat == ReportExportOptions.ExportType.Xls)
        {
            resp.AddHeader("content-disposition", "attachment; filename=\"ExcePreview.xls\"");
            resp.AppendHeader("content-length", expArray.Length.ToString());
            resp.Buffer = true;
        }
        expstream.Position = 0;
        resp.BinaryWrite(expArray);

        resp.OutputStream.Flush();
        resp.OutputStream.Close();
        resp.Flush();
        resp.Close();

        resp.End();
    }

// Previous version, not working
// Write to Response 


    if (resp != null)
    {
        resp.Clear();
        resp.Charset = "";
        resp.ContentType = contenttype;
        expstream.Position = 0;
        resp.BinaryWrite(expstream.ToArray());

        resp.End();
    }

}

编辑 2: 我在安装了 Microsoft Excel 2016 和 Microsoft Office Excel Viewer 的服务器上对此进行了测试。此导出 Excel 文件的网页也安装在该服务器上。我测试的应用程序使用了这种内容类型设置:

// Previous version, not working
// Write to Response 


    if (resp != null)
    {
        resp.Clear();
        resp.Charset = "";
        resp.ContentType = contenttype;
        expstream.Position = 0;
        resp.BinaryWrite(expstream.ToArray());

        resp.End();
    }

首先,安装 Excel 后,Excel 导出工作正常。当我选择“打开”时,使用导出的 Excel 文件打开了 Excel 2016。

然后我卸载了 Excel。相同的 Excel 导出的行为与本案例开头所解释的一样:Excel Viewer 未打开并且 Excel '文件'在浏览器窗口中打开。

能解释这一点的人将获得奖励。

【问题讨论】:

  • 您附加的图片扩展名为“.aspx”?这是你下载excel的页面吗?我认为的原因是在某些情况下“ExcelPreview.aspx”存在错误,因此无法下载。
  • 您是否将应用程序异常捕获到对您有帮助的地方。
  • 应该下载 Excel 文件的页面是 ExcelPreview.aspx 页面。不幸的是,事件日志中没有例外。 (也许我没有完全正确地回答你的问题。)
  • 问题是我认为您在运行代码时在某些服务器上出现错误。在所有代码中使用try catch,以防出现错误写入错误
  • 您从哪里访问该页面?请注意 URL...它正在访问 localhost...(并且没有 HTTPS)

标签: asp.net excel downloading-website-files


【解决方案1】:

关于您的第一次编辑,重要的是 Content-Disposition 标头。工作版本将此标头设置为attachment。这告诉浏览器该文件是某种下载文件,应该用另一个程序打开或保存。此外,它将文件名设置为“ExcePreview.xls”。 如果不设置Content-Disposition,默认值为inline,告诉浏览器,内容是网页或者应该显示在网页中。正如我们在您的第一个屏幕截图中看到的那样,文件名仍为 ExcelPreview.aspx。 一些系统可能会考虑 Content-Type 标头,忽略 aspx 扩展名,嗅探内容并将响应视为下载的 excel 文件,但不能保证这会起作用。

【讨论】:

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