Pregunta

No estoy seguro de cómo hacer para exportar mi documento de informe ActiveReports a XLS en mi aplicación asp.net mvc.

Mi concepto hasta ahora es tener una lista desplegable de tipos de exportación y un botón de envío que sostiene que el valor al controlador. Cuando estoy en el controlador, que regenerar el informe y lo paso a mi método de exportación. No estoy seguro de lo que tiene este método de exportación de retorno. También estoy consiguiendo un error de rango en el método xlsExport.Export real. A continuación se muestra mi método de exportación. También tener en cuenta, reportBase.Report es un objeto ActiveReport3.

private ActionResult Export(ReportBase reportBase)
        {
            Response.ClearContent();
            Response.ClearHeaders();

            var exportType = Request.Form["exportType"];

            switch (exportType)
            {
                case "RTF":
                    Response.ContentType = "application/octet-stream";
                    Response.AddHeader("Content-Disposition", "attachment;filename=report.rtf");
                    var rtfExport = new RtfExport();
                    rtfExport.Export(reportBase.Report.Document, Response.OutputStream);
                    break;
                case "TIFF":
                    Response.ContentType = "image/tiff";
                    Response.AddHeader("Content-Disposition", "attachment;filename=report.tif");
                    var tiffExport = new TiffExport();
                    var filePath = System.IO.Path.GetTempFileName();
                    tiffExport.Export(reportBase.Report.Document, filePath);

                    var fileStream = System.IO.File.Open(filePath, System.IO.FileMode.Open);
                    var bufferLength = (int)fileStream.Length;
                    var output = new byte[bufferLength];
                    var bytesRead = fileStream.Read(output, 0, bufferLength);

                    Response.OutputStream.Write(output, 0, bytesRead);
                    System.IO.File.Delete(filePath);
                    break;
                case "XLS":
                    Response.ContentType = "application/octet-stream";
                    Response.AddHeader("Content-Disposition", "attachment;filename=report.xls");
                    var xlsExport = new XlsExport();
                    xlsExport.Export(reportBase.Report.Document, Response.OutputStream);
                    break;
            }

            Response.Flush();
            Response.End();

            return View("Display", reportBase);

        }
¿Fue útil?

Solución

No tengo una respuesta para su problema. Incluyendo el mensaje de excepción total sería de gran ayuda. No hay suficiente información para que te ayude, pero me gustaría comprobar para asegurarse de reportBase.Report.Document no es nulo.

Sin embargo, yo quiero comentar sobre su código en general. Su acción del controlador no está siguiendo las convenciones de ASP.NET MVC. No debería estar escribiendo directamente a la corriente Reponse. En primer lugar, es difícil de probar la unidad. En segundo lugar, tiende a hacer que su acción estallan en la responsabilidad (que ya es aproximadamente 4 veces más grande que yo prefiero mis más grandes controladores de ser) El Response.End está cortando la acción corta y el "retorno Ver ()" no hace nada. Me gustaría hacer algo como:

var exportType = Request.Form["exportType"];
switch (exportType)
{
  case "RTF":
    return new RtfExportResult(reportBase.Report.Document);
  case "TIFF":
    return new TiffExportResult(reportBase.Report.Document);
  case "XLS":
    return new XlsExportResult(reportBase.Report.Document);
}

return View("Error"); // unsupported export type

A continuación, su XlsExportResult se vería así:

public class XlsExportResult : ActionResult
{
    private readonly Document document;

    public XlsExportResult(Document document)
    {
        this.document= document;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/octet-stream";
        response.AddHeader("Content-Disposition", "attachment;filename=report.xls");
        var xlsExport = new XlsExport();
        xlsExport.Export(this.document, response.OutputStream);
    }
}

A continuación, podría escribir pruebas para ejercer sólo la parte XlsExport más fácilmente. (También me gustaría encontrar una manera de ocultar detrás de una interfaz XlsExport.) Con un poco de creatividad (añadiendo prperties adicionales para cosas como el nombre del archivo, etc) podrás volver a utilizar las clases de Resultados * a través de su proyecto.

Otros consejos

Se puede hacer referencia a la solicitud muestra que figura en esta entrada del blog que detalla acerca de cómo exportar informes utilizando ActiveReports en una aplicación MVC.

http://blogs.gcpowertools.co. en / 2012/02 / exportadores-informes-creado-using.html

Este blog explica con detalle que los pasos que hay que seguir y exactamente cómo hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top