Как экспортировать ActiveReport в XLS в приложении ASP.Net MVC?

StackOverflow https://stackoverflow.com/questions/946457

Вопрос

Я не знаю, как экспортировать документ отчета 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);

        }
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top