Domanda

Non sono sicuro di come fare per esportare il mio ActiveReports documento riportare in XLS nel mio asp.net app MVC.

Il mio concetto finora è quello di avere un menu a discesa dei tipi di esportazione e di un pulsante di invio che sostiene che il valore per il mio controller. Quando sono sul controller, ho rigenerare il rapporto e passarlo al mio metodo di esportazione. Io non sono sicuro di cosa ha questo metodo di esportazione di ritorno. Sto anche ricevendo un errore di gamma sul metodo xlsExport.Export vero e proprio. Qui di seguito è il mio metodo di esportazione. Anche da notare, reportBase.Report è un oggetto 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);

        }
È stato utile?

Soluzione

Non ho una risposta per il problema. Compreso il messaggio completo eccezione sarebbe utile. Non ci sono informazioni sufficienti per me per aiutare voi, ma mi piacerebbe verificare che reportBase.Report.Document non è nullo.

Comunque, io non voglio commentare il codice in generale. La vostra azione di controllo non segue le convenzioni della ASP.NET MVC. Non dovrebbe essere scrivendo direttamente al flusso reponse. In primo luogo, è difficile unit test. In secondo luogo, essa tende a rendere la vostra azione esplodere nella responsabilità (è già circa 4 volte più grande di quanto io preferisco i miei più grandi controllori di essere) Il Response.End sta tagliando corto l'azione e il "ritorno View ()" non fa nulla. Vorrei fare qualcosa di simile:

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

Allora il vostro XlsExportResult sarà simile:

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

È quindi possibile scrivere i test di esercitare solo la parte XlsExport più facilmente. (Mi piacerebbe anche trovare un modo per nascondere XlsExport dietro un'interfaccia.) Con un po 'di creatività (aggiungendo prperties supplementari per cose come il nome del file, ecc) sarete in grado di riutilizzare le classi dei risultati * attraverso il vostro progetto.

Altri suggerimenti

È possibile fare riferimento alla applicazione di esempio contenute in questo post del blog che elenca in dettaglio su come esportare i report utilizzando ActiveReports in un'applicazione MVC.

http://blogs.gcpowertools.co. in / 2012/02 / esportatori-report-creato-using.html

Questo blog spiega in dettaglio che passi che è necessario seguire ed esattamente come farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top