1

我正在使用 OpenXML 库生成和 excel 文件并将其发送给用户。它在 Chrome 和 IE 上运行得很好,但是当我用 Firefox 尝试它时,我遇到了一个问题。

当使用 FF 保存文件时,我得到一个没有扩展名的文件当使用 FF 打开文件时,它就像一个魅力:(

我正在使用以下函数将流发送给用户。

public static void SendToClient(Byte[] stream, string fileName)
{
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

    HttpContext.Current.Response.BinaryWrite(stream);
    HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".xlsx");
    HttpContext.Current.Response.AddHeader("content-length", stream.LongLength.ToString());
    HttpContext.Current.Response.End();
}

并这样称呼它:

_ExcelReports.SendToClient(excelUtil.ExportToExcel(excelWorkBook), projectName + " Resources");

更奇怪的是,FF 下载对话框可以识别文件,如屏幕截图所示:

FF 下载对话框

现在完成下载:

FF 完成下载

4

2 回答 2

3

你试过使用contentType = "application/vnd.ms-excel"吗?

我是一个新手,在弄清楚我要做什么时遇到了更大的问题,但我所做的一点工作就是使用那种内容类型。

于 2013-05-05T22:21:08.857 回答
1

该代码示例对我有用。所以是时候提出一些随机调试建议了。

1) 尝试清除 Firefox 的历史/cookie/内容缓存。然后再次运行它。缓存可能会破坏响应。

2) SendToClient() 函数是要运行的最后一个函数吗?因为如果在它之后还有其他操作(因为它包含 Response.End() 函数),可能会发生一些奇怪的事情或破坏响应流。

3)尝试注释设置ContentEncoding的代码行,以及添加内容长度的代码行。事实上,试试这个 SendToClient() (对我有用的最低限度):

HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

HttpContext.Current.Response.BinaryWrite(stream);
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".xlsx");
HttpContext.Current.Response.End();

基本上,它是测试对 IE 和 Chrome 仍然有效但对 FF 失败的最少代码行。

4)尝试“内联”而不是“附件”进行内容配置,看看是否首先有效。

当然,我假设 OpenXML 文件本身是有效的。当您打开下载的文件(无论是使用 IE 还是 Chrome)时,Excel 是否会抱怨(比如要求修复文件或其他内容)?

于 2013-05-06T02:50:04.000 回答