استخدام Aspose.Slides مع ReportViewer 2010 و 2012
صفِّة RplRenderer تقوم برسم تخطيط صفحة التقرير (RPL) تنسيق تيار ثنائي إلى عرض تقديمي PowerPoint.
عينة من الكود
سيظهر هذا الكود كيفية تصدير تقرير من ReportViewer 2010/2012 إلى PPT/PPTX باستخدام RplRenderer. نفّذ أسلوب RenderToPpt لرسم تقرير حالي إلى PPT.
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using Microsoft.Reporting.WinForms;
namespace Slides.ReportViewer2010
{
class SlidesExportHelper
{ /// <summary>
/// يرسم التقرير الحالي إلى عرض تقديمي PowerPoint
/// </summary>
/// <param name="reportViewer">كائن عارض التقرير.</param>
/// <param name="format">تنسيق العرض التقديمي الناتج.</param>
/// <param name="filename">اسم الملف الناتج.</param>
public static void RenderWithAsposeSlides(ReportViewer reportViewer, Aspose.Slides.ReportingServices.OutputPresentationFormat format, string filename)
{
//تمكين ميزة التصدير إلى RPL
EnableRplRenderExtension(reportViewer);
//إنشاء ملف لعرضنا التقديمي
using (FileStream pptSteam = new FileStream(filename, FileMode.Create))
{
Aspose.Slides.ReportingServices.RplRenderer renderer = new Aspose.Slides.ReportingServices.RplRenderer();
//بدء عملية الرسم
//هنا نختار تصدير بتنسيق PPT وتوفير outputStream
renderer.StartRendering(format);
int page = 1;
//تكرار هذه الدورة عبر جميع صفحات التقرير
while (true)
{
using (MemoryStream rplStream = CreateRplStream(reportViewer, page))
{
//إذا كان rplStream فارغًا فنحن قد وصلنا إلى نهاية التقرير
if (rplStream.Length == 0)
break;
//إضافة صفحة التقرير كشريحة إلى الوثيقة
renderer.RenderPage(rplStream);
}
page++;
}
//استدعاء أسلوب الانتهاء لضخ عرضنا التقديمي الجديد إلى تيار الإخراج
renderer.FinishRendering(pptSteam);
}
}
/// <summary>
/// يمكّن امتداد رسم RPL.
/// كن حذرًا لأن هذه الطريقة تلحق الضرر بالحالة الداخلية لنسخة كائن ReportViewer
/// وليس هناك ضمان أن هذه الطريقة ستعمل مع الإصدارات المستقبلية من ReportViewer
/// </summary>
/// <param name="reportViewer">عارض التقرير.</param>
public static void EnableRplRenderExtension(ReportViewer reportViewer)
{
object service = null;
if (reportViewer.ProductVersion.StartsWith("11"))
service = reportViewer.LocalReport.GetType().GetField("m_processingHost", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(reportViewer.LocalReport);
else
service = reportViewer.LocalReport.GetType().GetField("m_previewService", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(reportViewer.LocalReport);
var extensions = service
.GetType()
.GetMethod("ListRenderingExtensions")
.Invoke(service, null);
IList RenderingExtensions = (IList)extensions;
bool rplExportEnabled = false;
foreach (var extension in RenderingExtensions)
{
var name = extension
.GetType()
.GetProperty("Name")
.GetValue(extension, null)
.ToString();
if (name == "RPL")
{
extension
.GetType()
.GetField("m_isExposedExternally",
BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(extension, true);
rplExportEnabled = true;
break;
}
}
if (!rplExportEnabled)
throw new Exception("لا يمكن تمكين تصدير RPL. يرجى التأكد من أنك تستخدم ReportViewer 2010 أو ReportViewer 2012.");
}
/// <summary>
/// يرسم صفحة معينة إلى RPL
/// </summary>
/// <param name="reportViewer">عارض التقرير.</param>
/// <param name="page">الصفحة.</param>
static MemoryStream CreateRplStream(ReportViewer reportViewer, int page)
{
Warning[] warnings;
var stream = new MemoryStream();
reportViewer.LocalReport.Render("RPL",
String.Format(
@"<DeviceInfo>
<StartPage>{0}</StartPage>
<EndPage>{0}</EndPage>
<SecondaryStreams>Embedded</SecondaryStreams>
</DeviceInfo>", page),
(CreateStreamCallback)delegate { return stream; },
out warnings);
return stream;
}
}
}
الاستخدام من نوافذ النماذج
قد ترغب في إضافة أزرار تصدير إلى TollStripPanel الخاص بـ ReportViewer عن طريق إضافة هذا الكود إلى مُنشئ الـ Form:
ToolStrip toolStrip = (ToolStrip) reportViewer.Controls.Find("toolStrip1", true)[0];
ToolStripItem exportButton = toolStrip.Items.Add("تصدير إلى Pptx");
exportButton.Click += new EventHandler((s,e) =>
{
SlidesExportHelper.RenderWithAsposeSlides(this.reportViewer,
OutputPresentationFormat.Pptx,
"SalesReport.pptx");
});
exportButton = toolStrip.Items.Add("تصدير إلى Ppt");
exportButton.Click += new EventHandler((s,e)=>
{
SlidesExportHelper.RenderWithAsposeSlides(this.reportViewer,
OutputPresentationFormat.Ppt,
"SalesReport.ppt");
});
- يمكن تنزيل مشروع العينة من هذا الرابط
- يمكن تنزيل مشروع نموذج الويب من هذا الرابط