【问题标题】:How do I export an ActiveReport to XLS in an ASP.Net MVC app?如何在 ASP.Net MVC 应用程序中将 ActiveReport 导出到 XLS?
【发布时间】:2026-02-01 20:20:10
【问题描述】:

我不确定如何在我的 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);

        }

【问题讨论】:

    标签: asp.net-mvc export activereports


    【解决方案1】:

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

    但是,我确实想对您的代码发表一般评论。您的控制器操作未遵循 ASP.NET MVC 的约定。它不应该直接写入响应流。首先,很难进行单元测试。其次,它往往会使你的动作在责任上爆炸(它已经比我喜欢的最大控制器大 4 倍左右) Response.End 正在缩短动作,而“返回 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 类。

    【讨论】:

    • 谢谢塔尔乔!这不仅使我的代码看起来更好,还解决了问题。我不确定如何以 MVC 方式操作响应。感谢您的帮助!
    【解决方案2】:

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

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

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

    【讨论】: