Utilisation d'Aspose.Slides avec ReportViewer 2010 et 2012



La classe RplRenderer rend le Format de flux binaire de mise en page de rapport (RPL) en présentation PowerPoint.

Code Exemple

Ce code montre comment exporter un rapport depuis ReportViewer 2010/2012 vers PPT/PPTX en utilisant RplRenderer. Exécutez la méthode RenderToPpt pour rendre un rapport actuel en PPT.

C#




using System;

using System.Collections;

using System.IO;

using System.Reflection;

using Microsoft.Reporting.WinForms;


namespace Slides.ReportViewer2010

{

    class SlidesExportHelper

    {        /// <summary>

        /// Rends le rapport actuel en présentation PowerPoint

        /// </summary>

        /// <param name="reportViewer">L'objet viewer de rapport.</param>

        /// <param name="format">Le format de présentation de sortie.</param>

        /// <param name="filename">Le nom du fichier de sortie.</param>

        public static void RenderWithAsposeSlides(ReportViewer reportViewer, Aspose.Slides.ReportingServices.OutputPresentationFormat format, string filename)

        {

            //Activer la fonction d'exportation vers RPL

            EnableRplRenderExtension(reportViewer);

            //créer un fichier pour notre présentation

            using (FileStream pptSteam = new FileStream(filename, FileMode.Create))

            {

                Aspose.Slides.ReportingServices.RplRenderer renderer = new Aspose.Slides.ReportingServices.RplRenderer();

                //démarrer le processus de rendu

                //ici nous choisissons d'exporter au format PPT et fournissons outputStream

                renderer.StartRendering(format);

                int page = 1;

                //ce cycle itère à travers toutes les pages du rapport

                while (true)

                {

                    using (MemoryStream rplStream = CreateRplStream(reportViewer, page))

                    {

                        //si rplStream est vide, nous avons atteint la fin du rapport

                        if (rplStream.Length == 0)

                            break;

                        //ajouter la page de rapport en tant que diapositive au document

                        renderer.RenderPage(rplStream);

                    }

                    page++;

                }

                //appeler la méthode finish pour vider notre nouvelle présentation dans le flux de sortie

                renderer.FinishRendering(pptSteam);

            }

        }

        /// <summary>

        /// Active l'extension de rendu RPL.

        /// Faites attention car cette méthode modifie l'état interne de l'instance de la classe ReportViewer

        /// et il n'y a aucune garantie que cette méthode fonctionnera avec les versions futures de ReportViewer

        /// </summary>

        /// <param name="reportViewer">Le viewer de rapport.</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("Impossible d'activer l'exportation RPL. Veuillez vous assurer que vous utilisez ReportViewer 2010 ou ReportViewer 2012.");

        }



        /// <summary>

        /// Rends une page spécifique en RPL

        /// </summary>

        /// <param name="reportViewer">Le viewer de rapport.</param>

        /// <param name="page">La 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;

        }

    }

}


Utilisation depuis Windows Forms

Vous pourriez vouloir ajouter des boutons d’exportation au TollStripPanel de ReportViewer en ajoutant ce code au constructeur du Formulaire :

C#




ToolStrip toolStrip = (ToolStrip) reportViewer.Controls.Find("toolStrip1", true)[0];



            ToolStripItem exportButton = toolStrip.Items.Add("Exporter vers Pptx");

            exportButton.Click += new EventHandler((s,e) =>

                                                       {

                                                           SlidesExportHelper.RenderWithAsposeSlides(this.reportViewer,

                                                                                                     OutputPresentationFormat.Pptx,

                                                                                                     "SalesReport.pptx");

                                                       });



            exportButton = toolStrip.Items.Add("Exporter vers Ppt");

            exportButton.Click += new EventHandler((s,e)=>

                                                       {

                                                           SlidesExportHelper.RenderWithAsposeSlides(this.reportViewer,

                                                                                              OutputPresentationFormat.Ppt,

                                                                                              "SalesReport.ppt");

                                                       });