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

Aar*_*mer 2 asp.net-mvc activereports export

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

        }
Run Code Online (Sandbox Code Playgroud)

Tal*_*joe 6

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

但是,我确实想要对您的代码进行评论.您的控制器操作不遵循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
Run Code Online (Sandbox Code Playgroud)

然后你的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写测试以更轻松地仅运行XlsExport部件.(我还找到了一种在界面后面隐藏XlsExport的方法.)通过一些创造性(为文件名等添加其他属性),您将能够在项目中重用*Result类.