Как экспортировать ActiveReport в XLS в приложении ASP.Net MVC? - PullRequest
2 голосов
/ 03 июня 2009

Я не уверен, как экспортировать мой отчетный документ 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 ]

6 голосов
/ 04 июня 2009

У меня нет ответа на ваш вопрос. Включение полного сообщения об исключении было бы полезно. У меня недостаточно информации, чтобы помочь вам, но я бы хотел убедиться, что 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 классы в вашем проекте.

0 голосов
/ 21 мая 2012

Вы можете обратиться к образцу приложения, приведенному в этом сообщении в блоге, в котором подробно описано, как экспортировать отчеты с использованием ActiveReports в приложении MVC.

http://blogs.gcpowertools.co.in/2012/02/exporting-reports-created-using.html

Этот блог подробно объясняет, какие шаги вам необходимо выполнить, и как именно это сделать.

...