0

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

结果是这样的

我们的应用程序在基于 Windows Server 2019 的虚拟机上运行。但是,如果我从其他计算机连接到该虚拟机上的 Web 服务器并打开相同的应用程序并将相同的报告导出到 Excel 文件中,一切正常。Web 浏览器询问我是否要保存或打开 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。相同的 Excel 导出的行为与本案例开头所解释的一样:Excel Viewer 未打开并且 Excel“文件”在浏览器窗口中打开。

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

4

1 回答 1

0

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

于 2021-03-08T21:16:53.900 回答