如何在 ASP.Net MVC 应用程序中将 ActiveReport 导出到 XLS?
-
09-09-2019 - |
题
我不确定如何在我的 asp.net mvc 应用程序中将 ActiveReports 报告文档导出到 XLS。
到目前为止,我的想法是有一个导出类型的下拉列表和一个将该值提交到我的控制器的提交按钮。当我在控制器上时,我重新生成报告并将其传递给我的导出方法。我不确定此导出方法会返回什么。我还在实际的 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);
}
解决方案
我对你的问题没有答案。包含完整的异常消息会很有帮助。我没有足够的信息来帮助您,但我会检查以确保 reportBase.Report.Document 不为空。
不过,我确实想对您的代码进行一般性评论。您的控制器操作不遵循 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 类。
其他提示
您可以参考本博客文章,详细介绍有关如何导出使用的ActiveReports报告在MVC应用程序给出的示例应用程序。
http://blogs.gcpowertools.co。在/ 2012/02 /出口的报告创建-using.html
本博客详细解释了这步,你需要遵循和究竟是如何做到这一点。