如何在ASP.Net MVC应用程序中将ActiveReport导出到XLS?

时间:2009-06-03 18:46:02

标签: asp.net-mvc export activereports

我不确定如何在我的asp.net mvc应用程序中将我的ActiveReports报告文档导出到XLS。

到目前为止,我的概念是有一个导出类型的下拉列表和一个提交按钮,将该值提交给我的控制器。当我在控制器上时,我重新生成报告并将其传递给我的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);

        }

2 个答案:

答案 0 :(得分:6)

我对你的问题没有答案。包含完整的异常消息会很有帮助。我没有足够的信息来帮助你,但我会检查以确保reportBase.Report.Document不为空。

但是,我确实想对您的代码发表评论。您的控制器操作不遵循ASP.NET MVC的约定。它不应该直接写入响应流。首先,单元测试很难。其次,它往往使你的行为在责任中爆炸(它已经比我更喜欢我最大的控制器大4倍)Response.End正在缩短行动,而“返回视图()”什么都不做。我会做类似的事情:

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类。

答案 1 :(得分:0)

您可以参考此博文中给出的示例应用程序,其中详细介绍了如何在MVC应用程序中使用ActiveReports导出报表。

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

此博客详细说明了您需要遵循的步骤以及确切的操作方法。