如何在从Web服务器保存excel文件时解决[1]IE错误?
我注意到Internet Explorer在从Internet下载的文件中添加了一个方括号中的数字(通常为[1])。这会在下载Excel电子表格时产生一个大问题,因为在Excel工作表名称中,方括号不是有效的文件名字符。这个问题是IE特有的,其他浏览器保持相同的文件名 因此,例如,如果在打开文件时自动刷新了数据透视表,则会收到一条错误消息,说明名称“file[1].yourPivotTableName”无效 那个问题有什么解决办法吗 编辑:似乎无论HTTP指令建议的文件名是什么,IE都会在所有情况下添加[1],这会导致问题!(因此,在这种情况下,有关文件名的答案没有帮助)如何在从Web服务器保存excel文件时解决[1]IE错误?,excel,download,vba,Excel,Download,Vba,我注意到Internet Explorer在从Internet下载的文件中添加了一个方括号中的数字(通常为[1])。这会在下载Excel电子表格时产生一个大问题,因为在Excel工作表名称中,方括号不是有效的文件名字符。这个问题是IE特有的,其他浏览器保持相同的文件名 因此,例如,如果在打开文件时自动刷新了数据透视表,则会收到一条错误消息,说明名称“file[1].yourPivotTableName”无效 那个问题有什么解决办法吗 编辑:似乎无论HTTP指令建议的文件名是什么,IE都会在所有情
编辑:我尝试了一些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";
重复的气味,但到目前为止,我还没有得到它的底部(也许Sebs的帖子解释了这一点)。此外,“内容配置”值似乎非常挑剔,使用a:而不是a;或者把它和“文件名”之间的空格去掉,它就爆炸了
此外,如果您在IIS上启用了压缩,这可能会为您解决问题:
Response.ClearHeaders()
我认为当你在IE中打开电子表格,IE将其保存到一个临时文件时,就会发生这种情况。我认为只有当电子表格的文件名中有一个以上的点时才会发生这种情况。用一个简单的“sample.xls”试试看。
另一个解决方法是告诉用户将文件保存到桌面,然后打开它。这是Internet Explorer的内置功能 停止使用“打开”,开始在文件下载窗口中使用“保存”,否则IE会将“[1]”附加到它放在某个临时文件夹中的文件名中
您可以使用它来构建一些.NET应用程序,它可以捕获创建下载文件或其他内容的事件并重命名该文件。我已经使用这个酷家伙提供的VBA实现了这一功能(请亲切地想想他)。 它重命名文件,然后重新附着轴
以下几点对我很有用:
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 + "\"";
}
private string EncodeFileName(字符串文件名)
{
fileName=HttpUtility.UrlEncode(fileName,Encoding.UTF8)。替换(“+”,”);
if(HttpContext.Current.Request.UserAgent.ToLower().Contains(“msie”))
{
var res=新的StringBuilder();
var chArr=fileName.ToCharArray();
对于(变量j=0;j
您只需确保在pivot的选项框中关闭自动刷新。现在,即使从服务器打开pivot,它也能完美地工作请在代码中插入以下四行:
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为,IE将把您的文件另存为file.html(无括号,呜呜呜呜!)。这就引出了一个解决方案:
编写一个脚本来处理来自*的请求,当您需要为XLS文件提供服务时,只需重定向到该脚本(使用您的文件名而不是星号),并将内容配置设置为“内联”。我使用传递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;
}
这对我来说效果不错。
希望它能对大家有所帮助。就我而言,我不能使用一张纸,但是,你是真的,只有当你试图直接打开文件时,问题才会出现,而不是在你保存文件时。但这不是一个好的“客户友好”回答…:)你的服务器设置是什么?IIS?阿帕奇?使用CMS?URL重写会有帮助吗?我的webapp是基于J2EE的,在IBM改进的apache服务器(IHS)后面的IBM Web应用服务器上工作。URL重写不会有帮助,因为这是IE的工作方式。我想了很多VBA宏来拯救我…我试图用excel宏以另一个名称保存文件,但问题仍然存在,即使文件名已更改…安装新的Internet Explorer。那么它与web服务器无关。新的Internet Explorer?你什么意思?我现在正在使用IE6,但缺陷似乎也出现在IE7中:我尝试了很多方法,包括在刷新透视表之前使用VBA宏以另一个名称保存文件。我现在还没有取得任何成功,但我认为这可能是解决方案的一部分。。。你认为呢?非常感谢,我认为这是解决问题的办法。我试试看。