【发布时间】: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-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 '文件'在浏览器窗口中打开。
能解释这一点的人将获得奖励。
【问题讨论】:
-
您附加的图片扩展名为“.aspx”?这是你下载excel的页面吗?我认为的原因是在某些情况下“ExcelPreview.aspx”存在错误,因此无法下载。
-
您是否将应用程序异常捕获到对您有帮助的地方。
-
应该下载 Excel 文件的页面是 ExcelPreview.aspx 页面。不幸的是,事件日志中没有例外。 (也许我没有完全正确地回答你的问题。)
-
问题是我认为您在运行代码时在某些服务器上出现错误。在所有代码中使用
try catch,以防出现错误写入错误 -
您从哪里访问该页面?请注意 URL...它正在访问 localhost...(并且没有 HTTPS)
标签: asp.net excel downloading-website-files