Click here to Skip to main content
15,886,737 members
Articles / Productivity Apps and Services / Microsoft Office

Exporting a DataGridView to an Excel/PDF/image file by using Reporting Services report generation

Rate me:
Please Sign up or sign in to vote.
4.94/5 (53 votes)
20 Aug 2008LGPL37 min read 379.7K   29K   248  
ReportExporters is a library for easy exporting of a DataGridView to Excel/PDF/image file types by using Reporting Services report generation.
using System;
using System.Collections.Generic;
using System.Text;
using ReportExporters.Common;
using ReportExporters.Common.Adapters;
using Microsoft.Reporting.WinForms;
using System.IO;
using ReportExporters.Common.Exporting;

namespace ReportExporters.WinForms
{
	public class WinFormsReportExporter : IReportExporter
	{
		IReportDataAdapter reportDataAdapter;
		IList<IReportDataAdapter> reportDataAdapters;

		bool SingleMode = true;

		public WinFormsReportExporter(IReportDataAdapter _reportDataAdapter)
		{
			reportDataAdapter = _reportDataAdapter;
			SingleMode = true;
		}

		public WinFormsReportExporter(IList<IReportDataAdapter> _reportDataAdapters)
		{
			reportDataAdapters = _reportDataAdapters;
			SingleMode = false;
		}

		private ReportBase genReport;

		protected byte[] ProcessReport(LocalReport report, string reportRenderType, string deviceInfo)
		{
			Warning[] warnings;
			string[] streamids;
			string mimeType;
			string encoding;
			string extension;
			byte[] bytes;

			IReportDataSourceBuilder reportBuilder;
			if (SingleMode)
			{
				reportBuilder = new SingleReportDataSourceBuilder(reportDataAdapter);
			}
			else
			{
				reportBuilder = new MultiReportDataSourceBuilder(reportDataAdapters);
			}

			try
			{
				genReport = reportBuilder.GenerateReport();
				string GeneratedRDLC = genReport.Rdlc;
				report.LoadReportDefinition(new StringReader(GeneratedRDLC));

				if (!SingleMode)
				{
					foreach (ReportBase subreport in genReport.SubReports)
					{
						report.LoadSubreportDefinition(subreport.Name, new StringReader(subreport.Rdlc));
					}
					report.SubreportProcessing += new SubreportProcessingEventHandler(report_SubreportProcessing);
				}

				#region ReportParameters

				//List<ReportParameter> reportParameters = new List<ReportParameter>();
				//IEnumerable<object> objReportParameters = reportDataAdapter.GetReportParameters();

				//if (objReportParameters != null)
				//{
				//  IEnumerator<object> enumerator = objReportParameters.GetEnumerator();
				//  try
				//  {
				//    enumerator.Reset();
				//    while (enumerator.MoveNext())
				//    {
				//      object currentParameter = enumerator.Current;
				//      if (currentParameter is ReportParameter)
				//      {
				//        reportParameters.Add((ReportParameter)currentParameter);
				//      }
				//    }
				//  }
				//  finally
				//  {
				//    enumerator.Dispose();
				//  }
				//}

				#endregion

				report.EnableExternalImages = true;
				report.EnableHyperlinks = true;
				report.DataSources.Add(new ReportDataSource(genReport.DataSourceName, genReport.ExportedTable));
				//report.SetParameters(reportParameters);

				bytes = report.Render(reportRenderType, deviceInfo, out mimeType, out encoding,
					out extension, out streamids, out warnings);
			}
			finally
			{
				//
			}

			return bytes;
		}

		void report_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
		{
			foreach (ReportBase subReport in genReport.SubReports)
			{
				e.DataSources.Add(new ReportDataSource( subReport.DataSourceName, subReport.ExportedTable));
			}
		}

		private MemoryStream GetExportedContent(string reportRenderType, string deviceInfo)
		{
			MemoryStream toRet;

			LocalReport localReport = new LocalReport();
			try
			{
				byte[] reportData = ProcessReport(localReport, reportRenderType, deviceInfo);
				toRet = new MemoryStream(reportData);
			}
			finally
			{
				localReport.Dispose();
			}

			return toRet;
		}

		#region IReportExcelExporter Members

		public MemoryStream ExportToXls()
		{
			return this.ExportToXls(null);
		}

		public MemoryStream ExportToPdf()
		{
			return this.ExportToPdf(null);
		}

		public MemoryStream ExportToXls(string deviceInfo)
		{
			return GetExportedContent(ReportRenderType.Excel, deviceInfo);
		}

		public MemoryStream ExportToPdf(string deviceInfo)
		{
			return GetExportedContent(ReportRenderType.PDF, deviceInfo);
		}

		public MemoryStream ExportToImage(string deviceInfo)
		{
			return GetExportedContent(ReportRenderType.IMAGE, deviceInfo);
		}

		#endregion
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Software Developer
Poland Poland
I also wrote Online Json Editor & 'Json/Xml to Excel converter'. It exports data to excel in the same way as the ReportExporters library does - plain/hierarchical views.
www.json-xls.com

Comments and Discussions