Pergunta

Estou inseguro como ir sobre como exportar meus ActiveReports denunciar documento para XLS no meu asp.net mvc aplicativo.

Meu conceito até agora é ter uma lista suspensa de tipos de exportação e um botão de envio que envia esse valor para meu controlador. Quando estou no controlador, eu regenerar o relatório e passá-lo para o meu método Export. Eu não sei o que tem este método de retorno Export. Eu também estou recebendo um erro de falta de variedade no método xlsExport.Export real. Abaixo está o meu método de exportação. Também a nota, reportBase.Report é um objeto 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);

        }
Foi útil?

Solução

Eu não tenho uma resposta para o seu problema. Incluindo a mensagem de exceção cheia seria útil. Não há informação suficiente para mim para ajudá-lo, mas eu verifique se reportBase.Report.Document não é nulo.

No entanto, eu quero comentar sobre o seu código em geral. Sua ação do controlador não está seguindo as convenções da ASP.NET MVC. Não deve ser escrita diretamente para o fluxo reponse. Em primeiro lugar, é difícil de teste de unidade. Em segundo lugar, ele tende a tornar a sua acção explodir em responsabilidade (já cerca de 4 vezes é maior do que eu prefiro as minhas maiores controladores de ser) O Response.End está cortando a curto ação eo "retorno View ()" não faz nada. Eu faria algo como:

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

Em seguida, seu XlsExportResult seria parecido com:

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);
    }
}

Você poderia, então, escrever testes de exercer apenas a parte XlsExport mais facilmente. (Eu também gostaria de encontrar uma maneira de esconder XlsExport atrás de uma interface). Com um pouco de criatividade (adicionando prperties adicionais para coisas como nome do arquivo, etc) você vai ser capaz de reutilizar as classes Resultado * através de seu projeto.

Outras dicas

Você pode consultar o aplicativo de amostra dada neste post que detalhes sobre como exportar relatórios usando ActiveReports em uma aplicação MVC.

http://blogs.gcpowertools.co. em / 2012/02 / exportação-relatórios criado-using.html

Este blog explica em detalhes que os passos que você precisa seguir e exatamente como fazê-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top