2009-06-03 5 views
2

私のasp.net mvcアプリケーションでActiveReportsレポート文書をXLSにエクスポートする方法がわかりません。ActiveReportをASP.Net MVCアプリケーションのXLSにエクスポートするにはどうすればよいですか?

これまでのコンセプトは、エクスポートタイプのドロップダウンと、その値をコントローラに送信する送信ボタンを持つことです。私がコントローラ上にいるとき、私はレポートを再生成し、エクスポートメソッドに渡します。私はこのエクスポート方法の戻り値を何にするか分からない。私はまた、実際のxlsExport.Exportメソッドで範囲外のエラーを取得しています。以下は私のエクスポートメソッドです。また、reportBase.Reportは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); 

     } 

答えて

6

私はあなたの問題の答えはありません。完全な例外メッセージを含めると参考になります。あなたに役立つ情報が十分ではありませんが、reportBase.Report.Documentがnullでないことを確認します。

しかし、あなたのコードに一般的にコメントしたいと思います。あなたのコントローラのアクションは、ASP.NET MVCの規約に従っていません。応答ストリームに直接書き込むべきではありません。まず、単体テストは難しい。第二に、それはあなたの行動を責任感をもって爆発させる傾向があります(私の最大のコントローラよりも約4倍の大きさです)。Response.Endはアクションを短縮し、 "return View()"は何もしません。あなたは、より簡単にのみXlsExportの一部を行使するためにテストを書くことができ

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

:次に、あなたのXlsExportResultは次のようになり

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 

:私のような何かをするだろう。 (私はまた、インターフェイスの後ろにXlsExportを隠す方法を見つけるだろう。)いくつかの創造性(ファイル名のようなもののための追加のプロパティを追加するなど)を使用すると、プロジェクト全体で* Resultクラスを再利用できるようになります。

+0

ありがとうTalljoe!これにより、私のコードがより良く見えるだけでなく、問題が解決されました。私はMVCのやり方でどのように応答を操作するのか分からなかった。助けてくれてありがとう! –

0

このブログの記事では、MVCアプリケーションでActiveReportsを使用してレポートをエクスポートする方法について詳しく説明しています。

http://blogs.gcpowertools.co.in/2012/02/exporting-reports-created-using.html

このブログは、あなたが正確に従うとする必要がある手順はどのようにそれを行うためのことを詳細に説明しています。

関連する問題