Frage

Ich bin nicht sicher, wie über das Exportieren von meinem Activereports Bericht Dokument XLS in meiner asp.net Mvc app zu gehen.

Ihr Konzept so weit ist einen Drop-Down-Exporttypen haben und einen Absenden-Button, die diesen Wert auf meinen Controller sendet. Als ich auf dem Controller bin, habe ich den Bericht regenerieren und es meine Export-Methode übergeben. Ich bin mir nicht sicher, was diese Methode Exportieren Rückkehr zu haben. Ich bin auch ein außerhalb des zulässigen Bereichs Fehler auf dem tatsächlichen xlsExport.Export Methode bekommen. Unten ist meine Export-Methode. Auch zu beachten, reportBase.Report ist ein ActiveReport3 Objekt.

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

        }
War es hilfreich?

Lösung

Ich habe keine Antwort auf Ihre Frage. wäre die vollständige Ausnahmemeldung einschließlich hilfreich. Es gibt nicht genug Informationen für mich, Ihnen zu helfen, aber ich würde überprüfen, um sicherzustellen reportBase.Report.Document nicht null ist.

Aber ich mag auf Ihrem Code im Allgemeinen äußern. Ihr Controller-Aktion folgt nicht den Konventionen von ASP.NET MVC. Es sollte nicht direkt mit dem reponse Stream schreiben. Zum einen ist es zu Unit-Test hart. Zweitens neigt sie dazu, die Aktion in Verantwortung explodiert (es ist bereits etwa 4-mal größer als ich meine größten Controller bevorzugen zu sein) Die Response.End schneidet die Aktion kurz und die „Ansicht zurückzukehren ()“ tut nichts. Ich würde so etwas wie:

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

Dann wird Ihr XlsExportResult würde wie folgt aussehen:

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

Sie könnten dann Tests schreiben nur den XlsExport Teil leichter zu trainieren. (Ich würde auch einen Weg finden XlsExport hinter einer Schnittstelle zu verbergen.) Mit etwas Kreativität (Hinzufügen zusätzliche prperties für Dinge wie Dateinamen, etc) Sie werden in der Lage sein, die * Ergebnis Klassen in Ihrem Projekt wiederverwendet werden.

Andere Tipps

Sie können in diesem Blog-Post gegeben auf die Beispielanwendung beziehen, die über Details wie Berichte mit Activereports in einer MVC-Anwendung exportieren.

http://blogs.gcpowertools.co. in / 2012/02 / Export-Berichte erstellt-using.html

Dieser Blog erklärt im Detail die Schritte, die Sie folgen müssen, und genau, wie es zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top