Como contornar o [1] IE bug ao salvar um arquivo do Excel a partir de um servidor Web?

StackOverflow https://stackoverflow.com/questions/120497

  •  02-07-2019
  •  | 
  •  

Pergunta

Tenho notado que o Internet Explorer acrescenta um número entre colchetes para arquivos baixados da internet (geralmente [1]). Isso cria um grande problema com o download de planilhas do Excel como colchetes não são um personagem nome de arquivo válido dentro nome da planilha Excel. Esse problema é IE específico, outros navegadores estão mantendo mesmo nome de arquivo.

Então, se você tem uma tabela dinâmica auto-atualizado na abertura de arquivo por exemplo, você receberá uma mensagem de erro dizendo que o nome "file [1] .yourPivotTableName" não é válido.

Existe alguma solução para esse problema?

EDIT: Parece que tudo o que o nome sugerido por HTTP directivas , IE adiciona [1] em todos os casos, o que causa o problema! (Então, respostas sobre nomes de arquivos não são úteis nesse caso)

EDIT: Eu tentei algum código VBA para salvar o arquivo com outro nome quando ele vai abrir. No entanto, ele não funciona (a mesma mensagem de erro do que antes). Você acha que há uma maneira de corrigir isso com VBA?

Foi útil?

Solução

Eu tenho que trabalhar usando VBA fornecidas por este cara legal (pense nele com carinho). Ele renomeia o arquivo e, em seguida, reata os pivôs.

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

Outras dicas

Eu acho que isso acontece quando você abrir a planilha no IE e IE salva em um arquivo temporário. E eu acho que isso só acontece quando o nome do arquivo da planilha tem mais de um ponto nela. Experimentá-lo com um simples "Sample.xls". Outra solução é informar aos usuários para salvar o arquivo para o desktop e, em seguida, abri-lo.

É um recurso embutido no Internet Explorer.

Pare de usar "Open", começar a usar o "Save" na janela de download de arquivo, caso contrário, o IE irá acrescentar "[1]" para o nome do arquivo que coloca em alguma pasta temporária.

Você pode construir alguma aplicação .NET usando System.IO .FileSystemWatcher que as capturas caso da criação do arquivo baixado ou algo assim e renomeia o arquivo.

Eu resolvi esse problema usando método onde passamos 3 parâmetros: nome do arquivo, extensão de arquivo (sem o .dot) e a solicitação HTTP); em seguida, fazer a codificação UTF-8 do nome do arquivo e extensão. Exemplo de código:

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;
}

Isso funcionou muito bem no meu caso. Espero que isso irá ajudá-lo a todos.

Na verdade, o .NET código correto é o seguinte:

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

Nota:. AppendHeader , não AddHeader , que eu acho que só funciona em debug web-servidor e IIS7

A seguir tem trabalhado para mim:

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

Você poderia apenas ter certeza de que nas opções de caixa para o pivô a atualização automática estiver desligada. Agora mesmo quando aberto a partir do servidor do pivô irá funcionar perfeitamente

Eu encontrei o mesmo problema e veio com (IMO) uma solução melhor que não precisa de qualquer VBA.

Se você definir cabeçalho "Content-Disposition" para "attachment; filename = <...>" em vez de "inline; filename = <...>" os navegadores normais de diálogo que permitirá salvar irá abrir ou aberto um arquivo com um nome definido em um cabeçalho, mas o Internet Explorer irá se comportar no tipo de forma estranha. Ele vai abrir de diálogo de download de arquivo e se você pressionar Salvar ele irá sugerir um nome de arquivo que é definido no cabeçalho, mas se você pressionar Abrir ele vai salvar o arquivo para uma pasta temporária e abri-lo com um nome que é o mesmo que o seu URN (sem 'namespace'), por exemplo, se o seu URI é http: //server/folder/file.html , então o IE irá salvar o arquivo como file.html (sem colchetes, woo hoo!). Isso nos leva a uma solução:

Escrever um script que alças solicitar http: // servidor / pasta / * e quando você precisa para servir um arquivo XLS apenas redirecionar para esse script (use seu nome de arquivo em vez de asterisco) com Content-Disposition definida para em linha .

Coloque estas quatro linhas em seu código:

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

Espero que isso ajude.

Em .NET eu descobri por experiência só isso parece funcionar para mim:

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

A duplicação cheiros, mas até agora eu nunca cheguei a parte inferior do mesmo (talvez Sebs pós explica isso). Também o valor "Content-Disposition" aparece uso muito mimado um: em vez de um; ou omitir o espaço entre ele e 'filename' e ele sopra!

Além disso, se você tem compressão habilitado no IIS pode consertar as coisas para você:

Response.ClearHeaders()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top