Error en Chrome al descargar Excel creado por ReportViewer

publicado por: Anonymous

Tengo el siguiente código en la vista:

<% using (Html.BeginForm("GeneraReporte", "Libro"))
{ %>
    <input id="format" runat="server" name="format" type="hidden" value="xls" />
    <input type="image" src="<%:Url.Content("~/Images/iconos/export_excel.png")%>" alt="Exportar Excel" />
<% } %>

En el Controller:

[HttpPost]
public ActionResult GeneraReporte()
{          
    try
    {
        String format = Request.Form["format"];
        Reportes reportes = new Reportes();
        DataTable lista_tabla = new DataTable();
        String sql = "SELECT dato1, dato2 from empresa";
        conexion.conectar();
        MySqlDataAdapter datos = new MySqlDataAdapter(sql, conexion.con);
        conexion.cerrar();
        datos.Fill(lista_tabla);

        string nombre_display = "Listado";
        string nombreDataSource = "DataSet_Excel";
        string formatoNameRender = "Excel";
        string nameArchivoExcel = "Libro_Diario";
        string nombreReporte = "Report_libro.rdlc";

        reportes.solicitaReporte(format, nombre_display, lista_tabla, nombreDataSource, formatoNameRender, nameArchivoExcel, nombreReporte);
    }
    catch (Exception error)
    {
    }

    return View();
}

En una clase de nombre Reportes, tengo las funciones que se encargan de generar el Excel:

public void solicitaReporte(string format, string nombre_display, dynamic query, string nombreDataSource, string formatoNameRender, string nameArchivoExcel, string nombreReporte)
{
    LocalReport report = new LocalReport();
    report.DisplayName = nombre_display;
    report.ReportPath = HttpContext.Current.Server.MapPath("~/Reportes/" + nombreReporte);
    ReportDataSource reportDataSource = new ReportDataSource();
    reportDataSource.Value = query;
    reportDataSource.Name = nombreDataSource;
    report.DataSources.Add(reportDataSource);

    byte[] bytes = report.Render(formatoNameRender);
    this.downloadReport(bytes, format, nameArchivoExcel);

    //return System.Web.Mvc.Controller.File(bytes, format);
}

private void downloadReport(byte[] data, string format, string nameArchivoExcel)
{
    Stream stream = new MemoryStream(data);

    byte[] buffer = new Byte[10000];
    int length;
    long data_length;
    try
    {
        data_length = stream.Length;
        HttpContext.Current.Response.ContentType = "application/octet-stream";
        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + nameArchivoExcel + "." + format);

        while (data_length > 0)
        {
            if (HttpContext.Current.Response.IsClientConnected)
            {
                length = stream.Read(buffer, 0, 10000);
                HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
                HttpContext.Current.Response.Flush();
                buffer = new Byte[10000];
                data_length = data_length - length;
            }
            else
            {
                data_length = -1;
            }
        }
    }
    finally
    {
        if (stream != null) { stream.Close(); }
        HttpContext.Current.Response.Close();
    }
}

Pero cuando intento descargar en Google Chrome, me dice

Error: Error de red.

Descargo cualquier otro archivo de Internet y no tengo problemas.
Lo raro es que me funciona en el Firefox.

Me gustaría saber, que debería hacer para evitar ese problema.

¿Cómo lo hago para que me funcione en Google Chrome?

Quizás habrá que habilitar algo en la web.config. Me gustaría poder al menos reproducir el error.

Imagen de transporte de red en Mozilla:

introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí

En Google Chrome:

introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí
introducir la descripción de la imagen aquí

solución

Encontré la solución, supuse que en la función downloadReport tenía algun problema, por lo tanto cambie la forma de hacerlo. Asi lo hice:

 public FileResult GeneraReporte(string format)//el format es "EXCEL"
    {
        string nombreDataSource="DataSet_1";

        string nombreReporte = "Report.rdlc";

        LocalReport report = new LocalReport();
        report.ReportPath = Server.MapPath("~/Reportes/" + nombreReporte);

        report.DataSources.Clear();
        ReportDataSource reportDataSource = new ReportDataSource();
        reportDataSource.Value = query();
        reportDataSource.Name = nombreDataSource;            
        report.DataSources.Add(reportDataSource);

        report.Refresh();

        return GetFileContentResult(report, format, null, "TestReport");


    public FileContentResult GetFileContentResult(Report report, String format, String deviceInfo, String fileDownloadName)
    {
        String mimeType;
        String encoding;
        String filenameExtension;
        String[] streamIds;
        Warning[] warnings;

        FileContentResult fileContentResult = new FileContentResult(report.Render(format, deviceInfo, out mimeType, out encoding, out filenameExtension, out streamIds, out warnings), mimeType);
        fileContentResult.FileDownloadName = Path.ChangeExtension(fileDownloadName, filenameExtension);

        return fileContentResult;
    }

Lo único que me quedaría con duda, que sucede cuando es para pdf, el format debería ser igual a PDF??

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *