从Web服务器保存excel文件时,如何解决[1] IE错误?
我注意到Internet Explorer在从Internet下载的文件中添加了一个方括号中的数字(通常为[1])。由于方括号不是Excel工作表名称中的有效文件名字符,因此在下载Excel电子表格时会遇到一个大问题。该问题是特定于IE的,其他浏览器保留相同的文件名。
因此,例如,如果我们有一个在打开文件时自动刷新的数据透视表,则会收到一条错误消息,指出名称" file [1] .yourPivotTableName"无效。
这个问题有什么解决办法吗?
编辑:看来,无论HTTP指令建议的文件名是什么,IE在所有情况下都会添加[1],这会导致问题! (因此,在这种情况下,有关文件名的答案无济于事)
编辑:我已经尝试过一些VBA代码,以便在文件打开时以其他名称保存文件。但是,它不起作用(错误消息与以前相同)。我们是否认为可以使用VBA解决此问题?
解决方案
实际上,正确的.NET代码如下:
Response.AppendHeader("content-disposition", "attachment;filename=file.xls"); Response.ContentType = "application/vnd.ms-excel";
注意:AppendHeader,而不是AddHeader,我认为它仅适用于调试Web服务器和IIS7.
在.NET中,我从经验中发现只有这似乎对我有用:
Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls"); Response.AddHeader("Content-Type", "application/vnd.ms-excel"); Response.ContentType = "application/vnd.ms-excel";
重复的气味,但到目前为止,我还没有深入了解它(也许塞伯斯的帖子对此做了解释)。同样,使用":"代替" content-Disposition"值显得非常挑剔。或者忽略它和"文件名"之间的空格,它会吹响!
另外,如果我们在IIS上启用了压缩功能,则可能会为我们解决问题:
Response.ClearHeaders()
我认为在IE中打开电子表格并将IE将其保存到临时文件时会发生这种情况。而且我认为只有在电子表格的文件名中包含多个点时才会发生这种情况。尝试使用简单的" sample.xls"。
另一个解决方法是告诉用户将文件保存到桌面,然后将其打开。
这是Internet Explorer的内置功能。
停止使用"打开",开始在文件下载窗口中使用"保存",否则IE会将" [1]"添加到它放置在某个临时文件夹中的文件的文件名中。
我们可以使用System.IO.FileSystemWatcher构建一些.NET应用程序,以捕获创建下载文件或者其他内容的事件并重命名该文件。
我已经使用了这个帅哥提供的VBA来工作(亲切地想他)。
它将重命名文件,然后重新添加枢轴。
http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/
以下对我有用:
private string EncodeFileName(string fileName) { fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", " "); if (HttpContext.Current.Request.UserAgent.ToLower().Contains("msie")) { var res = new StringBuilder(); var chArr = fileName.ToCharArray(); for (var j = 0; j < chArr.Length; j++) { if (chArr[j] == '.' && j != fileName.LastIndexOf(".")) res.Append("%2E"); else res.Append(chArr[j]); } fileName = res.ToString(); } return "\"" + fileName + "\""; }
我们只需要确保在枢轴的选项框中已关闭自动刷新即可。现在,即使从服务器打开,枢轴也可以正常工作
将以下四行放入代码中:
response.reset(); response.setHeader("Expires", "0"); response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0"); response.setHeader("Pragma", "public");
希望这可以帮助。
我遇到了同样的问题,并提出了(imo)不需要任何VBA的更好解决方案。
如果将" Content-Disposition"标头设置为" attachment; filename = <...>"而不是" inline; filename = <...>",则正常的浏览器将打开一个对话框,该对话框允许使用以下命令保存或者打开文件在标头中定义的文件名,但是Internet Explorer的行为有点怪异。它将打开文件下载对话框,如果按"保存",将建议在标题中定义一个文件名,但如果按"打开",它将文件保存到一个临时文件夹中,并使用与URN相同的名称打开它(不带"命名空间"),例如如果URI为http://server/folder/file.html,则IE会将文件另存为file.html(无括号,呜呼!)。这导致我们找到一个解决方案:
编写一个处理来自http:// server / folder / *的请求的脚本,当我们需要提供XLS文件时,只需将Content-Disposition设置为inline即可重定向到该脚本(使用文件名而不是星号)。