如何从Web服务器保存Excel文件时解决 IE错误?

我注意到,Internet Explorer在方括号中添加了一个从网上下载的文件(通常是[1])。 由于方括号不是Excel工作表名称中的有效文件名字符,因此下载Excel电子表格时会产生一个很大的问题。 这个问题是IE特定的,其他浏览器保持相同的文件名。

因此,如果您在文件打开时自动刷新数据透视表,则会收到一条错误消息,指出名称“file [1] .yourPivotTableName”无效。

有没有解决这个问题?

编辑:似乎无论由HTTP指令build议文件名 ,IE在所有情况下都会添加[1],这会导致问题! (所以,关于文件名的答案在这种情况下是没有帮助的)

编辑:我已经尝试了一些VBA代码保存文件时,它会打开另一个名称。 但是,它不起作用(和以前相同的错误信息)。 你认为有办法用VBA来解决这个问题吗?

我用这个很酷的家伙提供的VBA工作(深情地想到他)。 它重命名文件,然后重新附加枢轴。

http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/

我认为这是在IE中打开电子表格并将其保存到临时文件时发生的。 我想只有当电子表格的文件名有多个点时才会发生这种情况。 试一试简单的“sample.xls”。 另一个解决方法是告诉用户将文件保存到桌面,然后打开它。

这是Internet Explorer中的一项内置function。

停止使用“打开”,在文件下载窗口中开始使用“保存”,否则IE会追加“[1]”到它放置在临时文件夹中的文件的文件名。

您可以使用System.IO.FileSystemWatcher构build一些.NET应用程序,捕获创build下载文件的事件或重新命名文件。

我已经通过使用传递3个参数的方法解决了这个问题:文件名,文件扩展名(没有.dot)和HTTP请求); 然后做文件名和扩展名的UTF-8编码。 示例代码:

public static String encoding(String fileName, String extension, HttpServletRequest request) { String user = request.getHeader( "user-agent" ); boolean isInternetExplorer = ( user.indexOf( "MSIE" ) > -1 ); String var = ""; try { fileName = URLEncoder.encode( fileName, "UTF-8" ); fileName = fileName.trim().replaceAll( "\\+", " " ); extension = URLEncoder.encode( extension, "UTF-8" ); extension = extension.trim().replaceAll( "\\+", " " ); if ( isInternetExplorer ) { disposition = "attachment; filename=\"" + fileName+"."+extension+"\""; } else { var = "attachment; filename*=UTF-8''" + fileName+"."+extension; } } catch ( UnsupportedEncodingException ence ) { var = "attachment; filename=\"" + fileName+"."+extension; ence.printStackTrace(); } return var; } 

这在我的情况下工作得很好。 希望它能帮助你。

其实,正确的.NET代码如下:

 Response.AppendHeader("content-disposition", "attachment;filename=file.xls"); Response.ContentType = "application/vnd.ms-excel"; 

注意: AppendHeader ,而不是AddHeader ,我认为这只适用于debuggingWeb服务器和IIS7。

以下为我工作:

 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 + "\""; } 

您可以确保在枢轴的选项框中自动刷新被closures。 现在,即使从服务器打开枢轴将完美的工作

我遇到了同样的问题,并提出了(imo)一个更好的解决scheme,不需要任何VBA。

如果您将“Content-Disposition”标题设置为“attachment; filename = <…>”而不是“inline; filename = <…>”,则普通浏览器将打开对话框,以允许保存或打开文件在一个头文件中定义一个文件名,但Internet Explorer将performance在一种奇怪的方式。 它会打开文件下载对话框,如果你按下保存,它会提示一个在标题中定义的文件名,但是如果你按下打开,它会把文件保存到一个临时文件夹,并用一个和你的URN相同的名称来打开它没有“命名空间”),例如,如果你的URI是http://server/folder/file.html ,所以IE会将你的文件保存为file.html (没有括号,呜呼!)。 这导致我们解决scheme:

编写一个处理来自http:// server / folder / *的请求的脚本,并且当您需要提供XLS文件时,只需redirect到该脚本(使用您的文件名而不是星号)并将Content-Disposition设置为内联

把这四行放在你的代码中:

 response.reset(); response.setHeader("Expires", "0"); response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); 

希望这可以帮助。

在.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”值显得非常挑剔,使用a:而不是a; 或者省略它和“文件名”之间的空间,它会打击!

另外,如果您在IIS上启用了压缩function,则可能会为您解决以下问题:

 Response.ClearHeaders()