Создание пользовательского экспорта в 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, чтобы скрыть параметр экспорта:
Предупреждение рекомендуется при ссылке на нечеткий селектор 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.)