Как экспортировать ActiveReport в XLS в приложении ASP.Net MVC?
Я не уверен, как экспортировать мой отчетный документ ActiveReports в XLS в моем приложении asp.net mvc.
Моя концепция до сих пор состоит в том, чтобы иметь выпадающий список типов экспорта и кнопку отправки, которая передает это значение моему контроллеру. Когда я на контроллере, я регенерирую отчет и передаю его в мой метод экспорта. Я не уверен, что вернуть этот метод экспорта. Я также получаю ошибку вне допустимого диапазона для фактического метода 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);
}
2 ответа
У меня нет ответа на ваш вопрос. Включение полного сообщения об исключении было бы полезно. У меня недостаточно информации, чтобы помочь вам, но я бы хотел убедиться, что reportBase.Report.Document не равен NULL.
Тем не менее, я хочу прокомментировать ваш код в целом. Ваше действие контроллера не соответствует соглашениям 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.in/2012/02/exporting-reports-created-using.html
Этот блог подробно объясняет, какие шаги вам необходимо выполнить, и как именно это сделать.