Создание файла Excel из ReportViewer и отчета SQL Server - PullRequest
0 голосов
/ 31 августа 2011

У меня есть веб-приложение, в котором есть сетка, отображающая постраничный список данных для пользователя. Пользователю нужна возможность загрузить результаты в электронную таблицу Excel. Тем не менее, элементы, отображаемые в сетке, как я уже сказал, являются постраничными, и мне нужен весь набор результатов. Кроме того, я отображаю только около 7 полей на элемент, тогда как электронная таблица будет содержать все 20+ полей для элемента. Поэтому я не ищу решение для таблицы в Excel.

Я пытаюсь сделать что-то, с чем я работал раньше. У предыдущего работодателя (исходный код недоступен) у нас было приложение, содержащее отчет SQL Server в виде файла RDLC. Мы бы создали элемент управления ReportViewer в коде (var reportViewer = new ReportViewer ()). Затем мы привязываем отчет к элементу управления, предоставляем ему источник данных и затем выводим результаты в любом нужном нам формате. В моем случае мне нужен файл Excel, а затем передать ответный файл ExcelFile пользователю в ответе.

Я использую MVC3, поэтому я верну файл Excel в виде FileContentResult. Я искал интернет в течение дня и не могу найти то, что я ищу.

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Действие контроллера. Параметр формата должен быть «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 из любого отчета.

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

Редактировать: забыть вызвать функцию справки. К сожалению.

0 голосов
/ 31 августа 2011

Вы можете попробовать что-то вроде следующего ... Мы заполняем список объектов с нашего уровня доступа к данным, а затем передаем этот список объектов в нечто вроде следующего ...

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