using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Windows; using System.Xml; using DataObjects; using Telerik.Reporting; using Telerik.Reporting.Processing; using Telerik.Reporting.XmlSerialization; using DataItem = Telerik.Reporting.DataItem; using Path = System.IO.Path; using Report = Telerik.Reporting.Report; using SubReport = Telerik.Reporting.SubReport; using Table = Telerik.Reporting.Table; namespace ReportingSample { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { MyDataSource data = new MyDataSource(); GenerateReport(@"Z:\ForMichal\TelerikReports\Designer\Examples\Report1.trdx", "PPTX", @"Z:\ForMichal\output", "test.pptx", data); } /// /// the methods gets path to template, report format and output details and generates the report /// /// /// /// /// /// The object with the data /// The name of the function that used as DataSource, e.g. RfDetailsData (in RfPresentationData) protected void GenerateReport(string templatePath, string format, string outputPath, string outputFileName, MyDataSource data) { try { var reportProcessor = new ReportProcessor(); Report report; using ( var xmlReader = XmlReader.Create(templatePath, new XmlReaderSettings { IgnoreWhitespace = true })) { var xmlSerializer = new ReportXmlSerializer(); report = (Report)xmlSerializer.Deserialize(xmlReader); } //set data source to the report var dataSource = new ObjectDataSource(data, report.Name); report.DataSource = dataSource; //for each table in the report, set the data source as well var tables = report.Items.Find(typeof(Table), true); foreach (var table in tables) { if (table is DataItem dataItem) { if (dataItem.DataSource != null) { dataSource.DataMember = ((ObjectDataSource)dataItem.DataSource).DataMember; foreach (var param in ((ObjectDataSource)dataItem.DataSource).Parameters) { dataSource.Parameters.Add(param); } dataItem.DataSource = dataSource; } } } //set the data source to sub reports as well foreach (var subReport in report.Items.Find(typeof(SubReport), true)) { if (subReport is SubReport) { BindDataToSubReports(new ObjectDataSource(data, subReport.Name), (SubReport) subReport); } } //generate the report var reportSource = new InstanceReportSource() { ReportDocument = report }; RenderingResult generatedReport = reportProcessor.RenderReport(format, reportSource, new Hashtable()); //write the report to the file system string filePath = Path.Combine(outputPath, outputFileName); if (!Directory.Exists(outputPath)) Directory.CreateDirectory(outputPath); using (FileStream fs = new FileStream(filePath, FileMode.Create)) { fs.Write(generatedReport.DocumentBytes, 0, generatedReport.DocumentBytes.Length); } //open the report Process.Start(filePath); } catch (Exception ex) { //logger } } /// /// Bind between data source to sub reports. /// /// /// protected void BindDataToSubReports(ObjectDataSource objectDataSource, SubReport subReport) { string subReportPath = Path.Combine(@"Z:\ForMichal\TelerikReports\Designer\Examples\", subReport.ReportSource.ToString()); using (var xmlReader = XmlReader.Create(subReportPath, new XmlReaderSettings { IgnoreWhitespace = true })) { var xmlSerializer = new ReportXmlSerializer(); Telerik.Reporting.Report tempReport = (Telerik.Reporting.Report)xmlSerializer.Deserialize(xmlReader); var tempDataSource = (ObjectDataSource)tempReport.DataSource; var tempParameters = tempDataSource.Parameters; foreach (var parameter in tempParameters) { objectDataSource.Parameters.Add(parameter); } tempReport.DataSource = objectDataSource; var instanceSubReport = new InstanceReportSource() {ReportDocument = tempReport}; subReport.ReportSource = instanceSubReport; } } } }