2009-06-03 10 views
2

Je ne sais pas comment exporter mon document de rapport ActiveReports vers XLS dans mon application asp.net mvc.Comment exporter un ActiveReport vers XLS dans une application ASP.Net MVC?

Mon concept jusqu'ici est d'avoir une liste déroulante des types d'exportation et un bouton soumettre qui soumet cette valeur à mon contrôleur. Quand je suis sur le contrôleur, je régénère le rapport et le passe à ma méthode d'exportation. Je ne suis pas sûr de ce que doit avoir cette méthode d'exportation. Je reçois également une erreur hors plage sur la méthode xlsExport.Export réelle. Voici ma méthode d'exportation. Notez également que 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); 

     } 

Répondre

6

Je n'ai pas de réponse à votre problème. L'inclusion du message d'exception complète serait utile. Il n'y a pas assez d'informations pour que je puisse vous aider, mais je vérifierais que ReportBase.Report.Document n'est pas null.

Cependant, je veux commenter votre code en général. Votre action de contrôleur ne suit pas les conventions de ASP.NET MVC. Il ne devrait pas écrire directement dans le flux de réponse. Premièrement, il est difficile de faire un test unitaire. Deuxièmement, il a tendance à faire exploser votre action en responsabilité (il est déjà environ 4 fois plus grand que ce que je préfère mes plus gros contrôleurs) La réponse.End coupe court l'action 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 trouverais aussi un moyen de cacher XlsExport derrière une interface.) Avec un peu de créativité (en ajoutant des propriétés supplémentaires pour des choses comme le nom de fichier, etc.), vous serez en mesure de réutiliser les classes * Result dans votre projet.

+0

Merci Talljoe! Non seulement cela a rendu mon code beaucoup plus agréable, mais il a résolu le problème. Je ne savais pas comment manipuler la réponse de façon MVC. Merci pour l'aide! –

Questions connexes