2

asp.net mvc アプリで ActiveReports レポート ドキュメントを XLS にエクスポートする方法がわかりません。

これまでの私のコンセプトは、エクスポート タイプのドロップダウンと、その値をコントローラーに送信する送信ボタンを用意することです。コントローラーを使用しているときに、レポートを再生成して Export メソッドに渡します。この Export メソッドが何を返すのかわかりません。実際の 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);

        }
4

2 に答える 2

6

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

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

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

XlsExportResult は次のようになります。

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

その後、XlsExport 部分のみを実行するテストをより簡単に作成できます。(XlsExport をインターフェイスの背後に隠す方法も見つけたいと思います。) 創造性を働かせれば (ファイル名などのプロパティを追加することで)、プロジェクト全体で *Result クラスを再利用できるようになります。

于 2009-06-04T08:40:54.133 に答える
0

MVCアプリケーションでActiveReportsを使用してレポートをエクスポートする方法の詳細については、このブログ投稿にあるサンプルアプリケーションを参照できます。

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

このブログでは、従う必要のある手順とその正確な方法について詳しく説明しています。

于 2012-05-21T09:16:15.313 に答える