gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:29:52 25 4
gpt4 key购买 nike

我不确定如何在我的 asp.net mvc 应用程序中将 ActiveReports 报告文档导出到 XLS。

到目前为止,我的想法是有一个导出类型的下拉列表和一个将该值提交到我的 Controller 的提交按钮。当我在 Controller 上时,我重新生成报告并将其传递给我的导出方法。我不确定此导出方法会返回什么。我还在实际的 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 不为空。

但是,我确实想对您的代码进行总体评论。您的 Controller 操作不遵循 ASP.NET MVC 的约定。它不应该直接写入响应流。首先,单元测试很难。其次,它往往会使你的操作责任爆炸(它已经比我喜欢的最大 Controller 大大约 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 类。

关于asp.net-mvc - 如何在 ASP.Net MVC 应用程序中将 ActiveReport 导出到 XLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com