4

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

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

这个问题有什么解决办法吗?

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

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

4

10 回答 10

2

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

于 2008-09-23T12:15:50.217 回答
2

它是 Internet Explorer 中的内置功能。

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

您可以使用System.IO.FileSystemWatcher构建一些 .NET 应用程序,该应用程序捕获创建下载文件或其他内容的事件并重命名文件。

于 2008-09-23T13:29:18.620 回答
2

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

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

于 2008-10-27T19:38:09.853 回答
1

我通过使用传递 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;
}

这在我的情况下工作得很好。希望对大家有所帮助。

于 2014-10-08T07:34:56.113 回答
0

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

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

注意:AppendHeader,而不是AddHeader,我认为它只适用于调试 web 服务器和 IIS7。

于 2008-09-23T12:08:49.640 回答
0

以下对我有用:

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 + "\"";
    }
于 2008-11-20T07:37:37.183 回答
0

您可以确保在枢轴的选项框中关闭自动刷新。现在,即使从服务器打开,pivot 也能完美运行

于 2010-04-19T20:33:43.327 回答
0

将这四行放入您的代码中:

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

希望这可以帮助。

于 2010-04-28T14:05:49.887 回答
0

我遇到了同样的问题并想出了(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

于 2010-08-23T13:01:35.790 回答
-1

在.NET中,我从经验中发现只有这似乎对我有用:

            Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls");
            Response.AddHeader("Content-Type", "application/vnd.ms-excel");
            Response.ContentType = "application/vnd.ms-excel";

重复闻起来很臭,但到目前为止我还没有深入了解它(也许 Sebs 的帖子解释了这一点)。此外,“content-Disposition”值看起来非常挑剔,使用 a : 而不是 a ; 或省略它和“文件名”之间的空格,它会爆炸!

此外,如果您在 IIS 上启用了压缩,这可能会为您解决问题:

Response.ClearHeaders()
于 2008-09-23T12:12:20.380 回答