Создание пользовательского экспорта в Excel для ReportViewer (rdlc)

Я заинтересован в создании настраиваемой опции Экспорт в Excel для моего отчета в ReportViewer. Это в основном потому, что я хочу, чтобы pdf disalbed, и я сделал это через:

 ReportViewer1.ShowExportControls = false;

Поскольку в ReportViewer невозможно отключить какие-либо конкретные функции экспорта (например, pdf, но не excel). Вот мой (слегка) модифицированный код ниже. В идеале мне бы хотелось что-то похожее на предыдущие опции экспорта, где я могу сохранить файл в любом месте, которое я хочу.

EDIT: Код работает, но как мне нужно изменить Filestream, чтобы вместо автоматического сохранения файла я могу запросить пользователя, чтобы он мог сохранить в зависимости от того, какое местоположение они хотят?

protected void btnExportExcel_Click(object sender, EventArgs e)
{
    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string extension;

    byte[] bytes = ReportViewer1.LocalReport.Render(
       "Excel", null, out mimeType, out encoding,
        out extension,
       out streamids, out warnings);

    FileStream fs = new FileStream(@"c:\output.xls",
       FileMode.Create);
    fs.Write(bytes, 0, bytes.Length);
    fs.Close();

}

Ответы

Ответ 1

Я собрал это на основе документации Microsoft на ReportViewer и некоторых поисковых запросов Google, если кто-то столкнется с проблемой, похожей на мою:

protected void ExportExcel_Click(object sender, EventArgs e)
{
    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string extension;
    string filename;

    byte[] bytes = ReportViewer1.LocalReport.Render(
       "Excel", null, out mimeType, out encoding,
        out extension,
       out streamids, out warnings);

    filename = string.Format("{0}.{1}", "ExportToExcel", "xls");
    Response.ClearHeaders();
    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    Response.ContentType = mimeType;
    Response.BinaryWrite(bytes);
    Response.Flush();
    Response.End();
}

Ответ 2

Просто голова... принятый ответ будет отображаться как файл XLS, который был запрошен оригинальным плакатом.

Однако теперь вы можете экспортировать и в XLSX. Вы должны изменить параметр format метода Render() от "Excel" до "EXCELOPENXML".

Чтобы получить полный список возможных значений, вы можете позвонить ReportViewer1.LocalReport.ListRenderingExtensions(). Когда я запустил его в экземпляре просмотра отчетов, я получил следующие возможные варианты:

"Excel" "EXCELOPENXML" "IMAGE" "PDF" "WORD" "WORDOPENXML"

Мне было очень сложно определить, что вам нужно было передать для форматов. MSDN документирует это очень плохо, если вы спросите меня.

Ответ 3

Если вы хотите скрыть один параметр экспорта (хотя кажется, что вам кажется, что пользовательский экспорт полезен), вот два варианта:

Параметр A. С помощью CSS, чтобы скрыть параметр экспорта:

  • В окне отладки вашего браузера F12 найдите элемент HTML DOM для экспорта, щелкните его правой кнопкой мыши и скопируйте уникальный идентификатор CSS.
  • Добавьте это в свой CSS файл (заменив селектор CSS контекстом вашего буфера обмена):

    #ReportViewer1_ctl05_ctl04_ctl00_Menu > div:nth-child(3) 
    {
        display:none;
    }
    

Предупреждение рекомендуется при ссылке на нечеткий селектор CSS, подобный этому, поскольку это хакерский.

Вариант B. Использование кода для скрытия опции экспорта

  • Добавьте приведенный ниже метод в ваш .aspx.cs файл в качестве исходного кода.

    public void DisableUnwantedExportFormat(ReportViewer ReportViewerID, string strFormatName)
    {
        FieldInfo info;
        foreach (RenderingExtension extension in ReportViewerID.ServerReport.ListRenderingExtensions())
        {
            if (extension.Name == strFormatName)
            {
                info = extension.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
                info.SetValue(extension, false);
            }
        }
    }
    
  • Выберите соответствующий элемент Reportviewer и нажмите F4.

  • В окне "Свойства" щелкните значок "События", затем дважды щелкните элемент "PreRender", чтобы создать метод ReportViewer1_PreRender, я предполагаю, что ваш идентификатор управления ReportViewer является ReportViewer1, отредактируйте свой метод, как показано ниже:

    protected void ReportViewer1_PreRender(object sender, EventArgs e)
    {
        DisableUnwantedExportFormat((ReportViewer)sender,"Excel");
    }
    

(Источник: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/74dad27b-ef7e-4b9b-8922-666b317b3094/how-to-hide-pdf-in-export-option-in-ssrs-reportviewer?forum=sqlreportingservices и ответ на ссылку @valik.)