tienes - ¿Cómo evitar el error[1] de IE al guardar un archivo de Excel desde un servidor web?
problema al conectarse a onedrive comprueba tu conexion a internet y prueba otra vez (10)
Coloque 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.
Me di cuenta de que Internet Explorer agrega un número entre corchetes a los archivos descargados de internet (generalmente [1]). Esto crea un gran problema con la descarga de hojas de cálculo de Excel, ya que los corchetes no son un nombre de archivo válido dentro del nombre de la hoja de cálculo de Excel. Ese problema es específico de IE, otros navegadores mantienen el mismo nombre de archivo.
Por lo tanto, si tiene una tabla dinámica auto-actualizada en la apertura de archivos, por ejemplo, obtendrá un mensaje de error que dice que el nombre "archivo [1] .yourPivotTableName" no es válido.
¿Hay alguna solución para ese problema?
EDIT: parece que sea cual sea el nombre de archivo sugerido por las directivas HTTP , IE agrega [1] en todos los casos, ¡lo que causa el problema! (Entonces, las respuestas sobre nombres de archivo no son útiles en ese caso)
EDITAR: He intentado con un código VBA guardar un archivo con otro nombre cuando se abrirá. Sin embargo, no funciona (el mismo mensaje de error que antes). ¿Crees que hay una manera de arreglar eso con VBA?
Creo que esto sucede cuando abres la hoja de cálculo en IE e IE la guarda en un archivo temporal. Y creo que solo sucede cuando el nombre del archivo de la hoja de cálculo tiene más de un punto. Pruébalo con un simple "sample.xls". Otra solución es decirle a los usuarios que guarden el archivo en el escritorio y luego lo abran.
En .NET descubrí por experiencia que 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 huele, pero hasta ahora nunca he llegado al fondo (tal vez la publicación Sebs explica esto). También el valor de "contenido-Disposición" parece ser muy quisquilloso. Use a: en lugar de a; u omite el espacio entre él y ''nombre de archivo'' y explota!
Además, si tiene habilitada la compresión en IIS, esto puede arreglarle las cosas:
Response.ClearHeaders()
En realidad, el código .NET correcto es el siguiente:
Response.AppendHeader("content-disposition", "attachment;filename=file.xls");
Response.ContentType = "application/vnd.ms-excel";
Nota: AppendHeader , no AddHeader , que creo que solo funciona en depurar servidor web e IIS7.
Es una función incorporada en Internet Explorer.
Deje de usar "Abrir", comience a usar "Guardar" en la ventana de descarga de archivos; de lo contrario, IE agregará "[1]" al nombre de archivo del archivo que coloca en una carpeta temporal.
Puede construir alguna aplicación .NET usando System.IO.FileSystemWatcher que capte el evento de la creación del archivo descargado o algo así y cambie el nombre del archivo.
He encontrado el mismo problema y se me ocurrió (imo) una mejor solución que no necesita ningún VBA.
Si establece el encabezado "Content-Disposition" en "attachment; filename = <...>" en lugar de "inline; filename = <...>", los navegadores normales abrirán un cuadro de diálogo que permitirá guardar o abrir un archivo con un nombre de archivo definido en un encabezado, pero Internet Explorer se comportará de una manera extraña. Abrirá el cuadro de diálogo de descarga de archivos y si presiona Guardar , sugerirá un nombre de archivo definido en el encabezado, pero si presiona Abrir , guardará el archivo en una carpeta temporal y lo abrirá con un nombre que es el mismo que su URN ( sin ''espacio de nombres''), por ejemplo, si su URI es http: //server/folder/file.html , entonces IE guardará su archivo como file.html (sin corchetes, woo hoo!). Esto nos lleva a una solución:
Escriba un script que maneje la solicitud desde http: // servidor / carpeta / * y cuando necesite servir un archivo XLS simplemente redirija a ese script (use su nombre de archivo en lugar de asterisco) con Content-Disposition configurado en línea .
He resuelto este problema utilizando el método donde pasamos 3 parámetros: Nombre de archivo, extensión de archivo (sin el .dot) y la solicitud HTTP); luego haciendo la codificación UTF-8 del nombre de archivo y la extensión. Código de muestra:
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ó bien en mi caso. Espero que les ayude a todos.
Lo 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 + "/"";
}
Lo tengo trabajando usando VBA proporcionado por este tipo genial (piensa en él con cariño). Cambia el nombre del archivo y luego vuelve a conectar los pivotes.
http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/
Solo puede asegurarse de que en el cuadro de opciones para el pivote, la actualización automática esté desactivada. Ahora, incluso cuando se abre desde el servidor, el pivote funcionará perfectamente