Estoy trabajando en algún código que genere una hoja de cálculo de Excel en el servidor y luego lo descargue al usuario. Estoy usando ExcelPackage para generar el archivo.Descargue el archivo .xlsx usando Response.TransmitFile()
La generación está funcionando bien. Puedo abrir los archivos generados usando Excel 2007 sin problemas. Pero tengo problemas para descargar el archivo con Response.TransmitFile()
.
En este momento, tengo el siguiente código:
//Generate the file using ExcelPackage
string fileName = generateExcelFile(dataList, "MyReportData");
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.ContentType = "application/vnd.xls"
Response.Charset = "";
Response.TransmitFile(fileName);
Cuando Excel 2007 abre el archivo descargado que el anterior, se da el aviso "formato de archivo no coincide con la extensión". Después de hacer clic para pasar la advertencia, Excel muestra el contenido xml sin procesar del archivo.
Si cambio la extensión de archivo, al igual que
Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");
Excel 2007 da una "Excel encontró contenido no legible en el archivo" error, seguido de un diálogo que ofrece para localizar un convertidor en la web. Si hago clic en "no" en este cuadro de diálogo, Excel es capaz de cargar los datos.
También he experimentado con diferentes tipos de MIME, como application/vnd.ms-excel
y application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
, combinados con las extensiones de archivo .xls y .xlsx. Todas las combinaciones dan como resultado uno de los dos comportamientos mencionados anteriormente.
¿Cuál es la combinación correcta de extensión de archivo y tipo MIME para usar en este escenario? ¿Qué otra cosa podría causar esta falla, que no sea un tipo o extensión MIME incorrecta?
Para su información, esto ocurre con el servidor web de desarrollo incorporado de Visual Studio. Todavía no lo he intentado con IIS.
Ajuste de la cabecera Content-Length hizo el truco. Alternativamente, llamar a Response.End() después de TransmitFile() también funcionó. Entonces, ¿supongo que el navegador no sabía dónde estaba el final de la respuesta? – Odrade
Sin configurar el encabezado Content-Length ni llamar a Response.End(), el navegador definitivamente malinterpreta el tamaño del archivo y guarda demasiados datos en el archivo. ¡Gracias por la ayuda! – Odrade
Content-Length es definitivamente el camino a seguir aquí. Encontré información útil sobre Response.End() en el blog de Rick Strahl que debería compartirse con los futuros visitantes de esta página: http://west-wind.com/weblog/posts/368975.aspx – Odrade