所以在我们的网站上,我们有多个可以下载为 Excel 电子表格的报告,我们通过从硬盘读取空白模板文件,将其复制到 MemoryStream 中,然后使用 DocumentFormat.OpenXml.Spreadsheet 将数据推送到模板中来完成此操作; 然后我们将 MemoryStream 传递给一个函数,该函数设置标头并将流复制到响应中。
在 FF 和 Chrome 中运行良好,但 IE9(和 8,所以我的 QA 告诉我)随机弹出一个 Windows 安全登录对话框,要求您登录远程服务器。我可以取消对话框,或者点击确定(凭据似乎被忽略),然后按预期获取 Excel 文件。查看查询(使用 CharlesProxy)我无法弹出登录对话框,直到我再次禁用 CharlesProxy,所以我看不到我的开发机器和服务器之间的流量是否有任何差异。从我的本地主机(仅从开发/测试服务器)运行调试时也不会发生这种情况。
任何帮助都会很有用,有问题的代码如下。这是从后面代码中的服务器端函数调用的,因此 RespondAsExcel 会清除响应并改为放入 xlsx。
using (MemoryStream excelStream = new MemoryStream())
{
using (FileStream template = new FileStream(Server.MapPath(@"Reports\AlignedTemplateRII.xlsx"), FileMode.Open, FileAccess.Read))
{
Master.CopyStream(template, excelStream);
}
//Logic here to push data into the Memory stream using DocumentFormat.OpenXml.Spreadsheet;
Master.RespondAsExcel(excelStream, pgmName);
}
public void RespondAsExcel(MemoryStream excelStream, string fileName)
{
var contenttype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.Clear();
Response.ContentType = contenttype;
fileName = Utils.ReplaceWhiteSpaceWithUnderScores(fileName);
Response.AddHeader("content-disposition", "inline;filename=" + fileName);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(excelStream.ToArray());
//If that doesn't work, can try this way:
//excelStream.WriteTo(Response.OutputStream);
Response.End();
}
public void CopyStream(Stream source, Stream destination)
{
byte[] buffer = new byte[32768];
int bytesRead;
do
{
bytesRead = source.Read(buffer, 0, buffer.Length);
destination.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
}