我们有一个将基于 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-program和https:// /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“文件”在浏览器窗口中打开。
能解释这一点的人将获得奖励。