从ReportViewer和SQL Server报告创建Excel文件

时间:2011-08-31 13:21:10

标签: excel asp.net-mvc-3 report-viewer2010

我有一个Web应用程序,其网格向用户显示分页的数据列表。用户需要将结果下载到Excel电子表格的选项。但是,网格中显示的项目,就像我说的,Paged,我需要整个结果集。另外,我每个项目只显示大约7个字段,而电子表格将包含项目的所有20个字段。所以,我不是在寻找网格到Excel的解决方案。

我正在尝试做一些我以前真正合作过的事情。在以前的雇主(源代码不可用),我们有一个包含SQL Server报告的应用程序作为RDLC文件。我们将在代码中创建一个ReportViewer控件(var reportViewer = new ReportViewer())。然后,我们将报告绑定到控件,给它一个数据源,然后以我们需要的任何格式呈现结果。在我的情况下,我需要一个Excel文件,然后将ExcelFile流回到响应中的用户。

我正在使用MVC3,所以我将把Excel文件作为FileContentResult返回。我一直在互联网上搜索一天,但找不到我想要的东西。

2 个答案:

答案 0 :(得分:1)

控制器动作。格式参数应为'EXCEL'。

    public FileResult Report(String format)
    {
        LocalReport report = new LocalReport();
        report.ReportPath = Server.MapPath("~/TestReport.rdlc");

        report.DataSources.Clear();
        report.DataSources.Add(new ReportDataSource(GetData()));

        report.Refresh();

        return GetFileContentResult(report, format, null, "TestReport");
    }

从任何报告创建FileContentResult的Helper方法。

    public FileContentResult GetFileContentResult(Report report, String format, String deviceInfo, String fileDownloadName)
    {
        String mimeType;
        String encoding;
        String filenameExtension;
        String[] streamIds;
        Warning[] warnings;

        FileContentResult fileContentResult = new FileContentResult(report.Render(format, deviceInfo, out mimeType, out encoding, out filenameExtension, out streamIds, out warnings), mimeType);
        fileContentResult.FileDownloadName = Path.ChangeExtension(fileDownloadName, filenameExtension);

        return fileContentResult;
    }

编辑:忘记调用帮助功能。糟糕。

答案 1 :(得分:0)

您可以尝试以下内容......我们从数据访问级别填充对象列表,然后将对象列表传递给以下内容......

public static byte[] SaveExcelData<T>(List<T> answer)
{
    byte[] fileData = null;

    var grid = new System.Web.UI.WebControls.GridView();

    grid.DataSource = answer;
    grid.DataBind(); 

    HttpContext.Current.Response.ClearContent();
    string headerAddition = "attachment; filename=";
    headerAddition += answer[0].GetType().Name + ".xls";
    HttpContext.Current.Response.AddHeader("content-disposition", headerAddition);
    HttpContext.Current.Response.ContentType = "application/excel";
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    grid.RenderControl(htw);

    fileData = System.Text.Encoding.UTF8.GetBytes(sw.ToString());

    return fileData;
}