Cómo evitar el [1] es decir, error, mientras que el ahorro de un archivo de excel desde un servidor Web?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Me he dado cuenta de que Internet Explorer, se agrega un número entre corchetes a los archivos descargados de internet (por lo general [1]).Esto crea un gran problema con la descarga de hojas de cálculo de Excel como corchetes no son un nombre de archivo válido de caracteres dentro de Excel hoja de cálculo de nombre.El problema es IE específicos, otros navegadores están manteniendo el mismo nombre de archivo.

Por lo tanto, si usted tiene una tabla dinámica auto-actualiza en el archivo de la apertura, por ejemplo, obtendrá un mensaje de error diciendo que el nombre de archivo "[1].yourPivotTableName" no es válido.

Existe alguna solución a ese problema ?

EDITAR :Parece que cualquiera que sea el nombre de archivo sugerido por HTTP directivas, Es decir, añade [1] en todos los casos, lo que causa el problema !(Así, las respuestas acerca de los nombres de archivo no son útiles en ese caso)

EDITAR :He probado algunas código VBA para guardar el archivo con otro nombre cuando se va a abrir.Sin embargo, no funciona (el mismo mensaje de error que antes).¿Crees que hay una forma de arreglar eso con VBA ?

¿Fue útil?

Solución

Tengo que trabajar con VBA proporcionada por este tipo frío (creo que de él con cariño).Se cambia el nombre del archivo y, a continuación, vuelve a pegar los pivotes.

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

Otros consejos

Creo que esto sucede cuando se abre la hoja de cálculo en IE IE y lo guarda en un archivo temporal.Y creo que sólo ocurre cuando la hoja de cálculo de nombre de archivo tiene más de un punto en ella.Pruebe con un simple "sample.xls".Otra solución es decirle a los usuarios guardar el archivo en el escritorio y, a continuación, ábralo.

Es una característica integrada en Internet Explorer.

Deje de usar "Abrir", comience a usar "Guardar" en el archivo de descarga de la ventana, de lo contrario, es decir anexará "[1]" para el nombre del archivo que se coloca en algunos carpeta temporal.

Usted podría construir algunos .NET aplicación que utiliza Sistema.IO.FileSystemWatcher que detecta el evento de la creación del archivo descargado o algo y cambia el nombre del archivo.

Me han resuelto este problema mediante el método donde pasamos 3 parámetros:El nombre de archivo, extensión de archivo(sin el .dot) y la solicitud HTTP);luego de hacer la codificación UTF-8 de el nombre de archivo y extensión.Código De Ejemplo:

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

Esto funcionó muy bien en mi caso.Espero que os ayudarán a todos.

En realidad, la correcta .NET-código es el siguiente:

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

Nota: AppendHeader, no AddHeader, que creo que sólo funciona en la depuración de servidor web y IIS7.

La siguiente, me ha funcionado:

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

Usted podría sólo asegúrese de que en el cuadro de opciones para la dinámica de la actualización automática está desactivada.Ahora incluso cuando se abre desde el servidor de la dinámica funcione a la perfección

Me he encontrado con el mismo problema, y llegó con (omi), la mejor solución que no necesita ningún tipo de VBA.

Si establece "Content-Disposition" encabezado "el apego;nombre de archivo=<...>" en lugar de "en línea;nombre de archivo=<...>" el normal de los navegadores se abrirá una ventana de diálogo que le permitirá abrir o guardar un archivo con un nombre de archivo definido en un encabezado, pero en Internet Explorer se comporte en una especie de extraña manera.Se abrirá de diálogo descarga de archivos, y si se pulsa Guardar se le sugerirá un nombre de archivo que se define en la cabecera, pero si la prensa Abierto se va a guardar el archivo en una carpeta temporal y abrirlo con un nombre que es el mismo que el de su URNA (sin la 'espacio de nombres'), por ejemplo,si la URI es http://server/folder/file.html, así que IE va a guardar el archivo como file.html (sin corchetes, woo hoo!).Esto nos lleva a una solución:

Escribir un script que se encarga de solicitud de http://server/folder/* y cuando usted necesita para servir a un archivo XLS simplemente redirigir a que la secuencia de comandos (el uso de su nombre de archivo en lugar del asterisco) con Content-Disposition conjunto para en línea.

Poner estas cuatro líneas en su 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 esto ayude.

En .RED he encontrado a partir de la experiencia sólo esto parece funcionar para mí:

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

La duplicación de los olores, pero hasta ahora nunca he conseguido a la parte inferior de la misma (tal vez Sebs post explica esto).También el "content-Disposition" valor aparece muy quisquillosos utilizar un :en lugar de una ;o ommit el espacio entre ella y el 'nombre de archivo' y sopla!

También, si tienes habilitada la compresión en IIS esto puede arreglar las cosas para usted:

Response.ClearHeaders()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top