如何解决[1]即错误,同时节省excel文件从一个网络服务器?
题
我注意到Internet Explorer增加了一个数字在方括号内,从互联网下载的文件(通常[1]).这创造了一个很大的问题与下载的Excel电子表格作为方括号内是不是一个有效的文件名字里面的Excel工作表姓名。这个问题是即具体、其他浏览器保持相同文件的名称。
所以,如果你有一个枢轴表自动刷新文件的开口为例,你会得到错误的消息说,名为"文件[1].yourPivotTableName"是不是有效的。
是否有任何解决这一问题?
编辑:看来,不管什么 文件建议通过HTTP指令, ,即增加了[1]在所有情况下,造成问题!(因此,解答有关文件名是不是有帮助的,在这种情况下)
编辑:我已经尝试了一些载>>>情绪,以保存的文件在另一个名字的时候它会打开。然而,它不工作(相同的错误信息,比前)。你认为有一种方法来解决这个问题与VBA?
解决方案
我使用这个很酷的家伙提供的VBA工作(深情地想起他)。 它重命名文件,然后重新连接枢轴。
http:// php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/
其他提示
我认为当您在IE中打开电子表格并将IE保存到临时文件时会发生这种情况。我认为只有当电子表格的文件名中包含多个点时才会发生这种情况。尝试使用简单的<!>“sample.xls <!>”; 另一种解决方法是告诉用户将文件保存到桌面然后再打开它。
这是一个内在特性,在互联网浏览器。
停止使用"开放",开始使用"保存"在本文件载窗口,否则即将添加"[1]"的文件的文件,它将在一些临时文件夹。
你可以建立一些。网应用程序的使用 系统。IO.更改 捕捉的事件创造的下载文件或类和重新命名的文件。
我通过使用传递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 ,我认为这只适用于调试网络服务器和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 + "\"";
}
您可以确保在枢轴的选项框中关闭自动刷新功能。现在即使从服务器打开,枢轴也能正常工作
我遇到了同样的问题,并提出了(imo)一个不需要任何VBA的更好的解决方案。
如果设置<!>“; Content-Disposition <!>”;标题为<!>“;附件;文件名= LT <!>; ... GT <!>; <!> QUOT;而不是<!> quot; inline;文件名= LT <!>; ... GT <!>; <!> QUOT;普通的浏览器会打开一个对话框,允许保存或打开一个文件头中定义的文件名,但是Internet Explorer的行为方式会很奇怪。它将打开文件下载对话框,如果按保存,它将建议在标题中定义的文件名,但是如果按打开,它会将文件保存到临时文件夹并使用与您的URN (没有'命名空间')相同的名称打开它,例如如果您的URI是 http://server/folder/file.html ,那么IE将保存您的文件作为 file.html (没有括号,呜呜!)。这引出了我们的解决方案:
编写一个脚本来处理来自 http:// server / folder / *的请求以及何时需要提供服务XLS文件只是重定向到该脚本(使用您的文件名而不是星号), Content-Disposition 设置为 inline 。
将这四行放在您的代码中:
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";
重复的味道,但到目前为止,我从来没有到底(也许Sebs的帖子解释了这一点)。还有<!> quot; content-Disposition <!> quot;价值看起来非常挑剔使用a:而不是a;或者省略它和'filename'之间的空格,它就会爆炸!
此外,如果您在IIS上启用了压缩,这可能会为您解决问题:
Response.ClearHeaders()