我不确定如何在我的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);
}
答案 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
此博客详细说明了您需要遵循的步骤以及确切的操作方法。