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 不为空。

但是,我确实想对您的代码发表一般评论。您的控制器操作未遵循 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 类。

于 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 回答