Question

Je ne suis pas sûr comment aller sur l'exportation mon ActiveReports document de rapport XLS dans mon asp.net application mvc.

Mon concept jusqu'à présent est d'avoir un menu déroulant des types d'exportation et un bouton d'envoi qui soumet cette valeur à mon contrôleur. Quand je suis sur le contrôleur, je Régénérer le rapport et le transmettre à ma méthode à l'exportation. Je ne sais pas ce qu'il faut avoir ce retour de la méthode à l'exportation. Je suis aussi obtenir une erreur de dépassement de gamme sur la méthode de xlsExport.Export réelle. Ci-dessous ma méthode à l'exportation. A noter également, reportBase.Report est un objet 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);

        }
Était-ce utile?

La solution

Je n'ai pas de réponse à votre question. Y compris le message complet d'exception serait utile. Il n'y a pas assez d'informations pour moi de vous aider, mais je Vérifions reportBase.Report.Document est non nulle.

Cependant, je ne veux commenter votre code en général. Votre action du contrôleur ne suit pas les conventions de ASP.NET MVC. Il ne devrait pas être en train d'écrire directement au flux de Reponse. Tout d'abord, il est difficile de test unitaire. En second lieu, il a tendance à faire votre action en matière de responsabilité exploser (il est déjà environ 4 fois plus grand que je préfère mes plus grands contrôleurs être) Le Response.End est la coupe l'action court et le « retour View () » ne fait rien. Je ferais quelque chose comme:

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

Ensuite, votre XlsExportResult ressemblerait à ceci:

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

Vous pouvez alors écrire des tests pour exercer uniquement la partie XlsExport plus facilement. (Je voudrais aussi trouver un moyen de cacher XlsExport derrière une interface.) Avec un peu de créativité (en ajoutant prperties supplémentaires pour des choses comme nom de fichier, etc.), vous serez en mesure de réutiliser les * classes de résultats dans votre projet.

Autres conseils

Vous pouvez vous référer à l'exemple d'application donné dans ce billet de blog qui détaille sur la façon d'exporter des rapports en utilisant ActiveReports dans une application MVC.

http://blogs.gcpowertools.co. en / 2012/02 / exportateurs-rapports-créé-using.html

Ce blog explique en détail que les étapes que vous devez suivre et exactement comment le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top