Click here to Skip to main content
15,885,871 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.6K   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 System.Xml;
using System.Threading;
using System.IO;
using System.Data;
using ReportExporters.Common.Model.Style;
using System.Web.UI.WebControls;
using ReportExporters.Common.Rdlc.Enums;
using System.Drawing;
using System.Globalization;
using ReportExporters.Common.Rdlc;
using ReportExporters.Common.Model.DataColumns;
using ReportExporters.Common.Model;
using System.Collections.ObjectModel;
using ReportExporters.Common.Model.Images;

using RSize = ReportExporters.Common.Model.Size;
using ReportExporters.Common.Model.ControlItems;

namespace ReportExporters.Common.Rdlc.Wrapper
{
	internal interface IRdlElement
	{
		void WriteTo(XmlWriter xmlWriter);
	}

	internal class CounterProvider
	{
		internal int DataSourceCounter = 0;
	}

	internal class RdlcElement
	{
		internal CounterProvider Counters;

		public RdlcElement(CounterProvider _counterProvider)
		{
			Counters = _counterProvider;
		}
	}

	internal partial class RdlcWrapper
	{
		internal CounterProvider Counters;

		private RReport report;
		public RReport Report
		{
			get
			{
				return report;
			}
			set
			{
				report = value;
			}
		}

		public RdlcWrapper()
		{
			Counters = new CounterProvider();
			Report = new RReport(this);
		}

		internal partial class RReport : IRdlElement
		{
			#region Report Properties

			private RRect margin;
			public RRect Margin
			{
				get
				{
					return margin;
				}
				set
				{
					margin = value;
				}
			}

			private RSize width = new Unit(6.5, UnitType.Inch);
			public RSize Width
			{
				get
				{
					return width;
				}
				set
				{
					width = value;
				}
			}

			private RSize interactiveHeight = new Unit(11, UnitType.Inch);
			public RSize InteractiveHeight
			{
				get
				{
					return interactiveHeight;
				}
				set
				{
					interactiveHeight = value;
				}
			}

			public RSize interactiveWidth = new Unit(6.5, UnitType.Inch);
			public RSize InteractiveWidth
			{
				get
				{
					return interactiveWidth;
				}
				set
				{
					interactiveWidth = value;
				}
			}

			private REmbeddedImages embeddedImages;
			public REmbeddedImages EmbeddedImages
			{
				get
				{
					return embeddedImages;
				}
				set
				{
					embeddedImages = value;
				}
			}

			private string language = Thread.CurrentThread.CurrentCulture.Name;
			public string Language
			{
				get
				{
					return language;
				}
				set
				{
					language = value;
				}
			}

			#endregion

			private string rdReportID = Guid.NewGuid().ToString();

			#region Designer Properties

			public bool DrawGrid = true;
			public bool SnapToGrid = true;

			#endregion

			#region General Properties

			private RDataSources dataSources;
			public RDataSources DataSources
			{
				get
				{
					return dataSources;
				}
				set
				{
					dataSources = value;
				}
			}

			private RDataSets dataSets;
			public RDataSets DataSets
			{
				get
				{
					return dataSets;
				}
				set
				{
					dataSets = value;
				}
			}

			private RBody body;
			public RBody Body
			{
				get
				{
					return body;
				}
				set
				{
					body = value;
				}
			}

			#endregion

			public RReport(RdlcWrapper rdlcWrapper)
			{
				Margin = new RRect("", "Margin", new Rect(new Unit(1.0, UnitType.Inch)));

				DataSources = new RDataSources();
				DataSets = new RDataSets();
				Body = new RBody();
				EmbeddedImages = new REmbeddedImages();

				DataSources.Add(new RDataSource(rdlcWrapper.Counters));
			}

			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("Report");
				{
					// Namespaces
					xmlWriter.WriteAttributeString("xmlns", "", null, "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
					xmlWriter.WriteAttributeString("xmlns", "rd", null, "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");

					DataSources.WriteTo(xmlWriter);

					Margin.WriteTo(xmlWriter);

					xmlWriter.WriteElementString("rd:ReportID", rdReportID);

					if (EmbeddedImages.Count > 0)
					{
						EmbeddedImages.WriteTo(xmlWriter);
					}

					//design properties
					xmlWriter.WriteElementString("rd:DrawGrid", RdlcWrapper.RdlcValueConverter.GetBoolean(DrawGrid));
					xmlWriter.WriteElementString("rd:SnapToGrid", RdlcWrapper.RdlcValueConverter.GetBoolean(SnapToGrid));

					Body.WriteTo(xmlWriter);

					xmlWriter.WriteElementString("Width", Width.ToString());
					xmlWriter.WriteElementString("InteractiveHeight", InteractiveHeight.ToString());
					xmlWriter.WriteElementString("InteractiveWidth", InteractiveWidth.ToString());

					xmlWriter.WriteElementString("Language", Language);

					DataSets.WriteTo(xmlWriter);
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		#region SubClasses

		internal class ReportControlItem : IRdlElement
		{
			private static int ReportControlItemsCount = 0;

			private ControlItem CItem;
			/// <summary>
			/// Report Control Item
			/// </summary>
			internal ControlItem Item
			{
				get
				{
					return CItem;
				}
			}

			private int _uniqueIndex;
			protected int UniqueIndex
			{
				get
				{
					return _uniqueIndex;
				}
			}

			protected ReportControlItem(ControlItem controlItem)
			{
				CItem = controlItem;
				_uniqueIndex = ++ReportControlItemsCount;
			}

			public virtual void WriteTo(XmlWriter xmlWriter)
			{
				if (CItem.Width.HasValue)
				{
					xmlWriter.WriteElementString("Width", CItem.Width.ToString());
				}
				if (CItem.Top.HasValue)
				{
					xmlWriter.WriteElementString("Top", CItem.Top.ToString());
				}
				if (CItem.Left.HasValue)
				{
					xmlWriter.WriteElementString("Left", CItem.Left.ToString());
				}
				if (CItem.Height.HasValue)
				{
					xmlWriter.WriteElementString("Height", CItem.Height.ToString());
				}

				if (CItem.Style != null)
				{
					RStyle rStyle = new RStyle(this, CItem.Style);
					rStyle.WriteTo(xmlWriter);
				}
			}
		}

		internal class REmbeddedImage : IRdlElement
		{
			EmbeddedImage EmbImage;

			public REmbeddedImage(EmbeddedImage embeddedImage)
			{
				EmbImage = embeddedImage;
			}

			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("EmbeddedImage");
				{
					xmlWriter.WriteAttributeString("Name", EmbImage.Name);
					xmlWriter.WriteElementString("MIMEType", RdlcValueConverter.GetMIMEType(EmbImage.MIMEType.Value));
					xmlWriter.WriteElementString("ImageData", Convert.ToBase64String(EmbImage.ImageData));
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		internal class RReportItems : Collection<ReportControlItem>, IRdlElement
		{
			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("ReportItems");
				{
					foreach (ReportControlItem reportItem in this)
					{
						reportItem.WriteTo(xmlWriter);
					}
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		internal class REmbeddedImages : Collection<REmbeddedImage>, IRdlElement
		{
			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("EmbeddedImages");
				{
					foreach (REmbeddedImage embeddedImage in this)
					{
						embeddedImage.WriteTo(xmlWriter);
					}
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		internal class PageHeader : ReportItemCointainer
		{
			private bool printOnFirstPage;
			public bool PrintOnFirstPage
			{
				get { return printOnFirstPage; }
				set { printOnFirstPage = value; }
			}

			private bool printOnLastPage;
			/// <summary>
			/// Not used in singlepage reports.
			/// </summary>
			public bool PrintOnLastPage
			{
				get { return printOnLastPage; }
				set { printOnLastPage = value; }
			}
		}

		internal class PageFooter : ReportItemCointainer
		{
			private bool printOnFirstPage;
			/// <summary>
			/// Not used in singlepage reports.
			/// </summary>
			public bool PrintOnFirstPage
			{
				get { return printOnFirstPage; }
				set { printOnFirstPage = value; }
			}

			private bool printOnLastPage;
			public bool PrintOnLastPage
			{
				get { return printOnLastPage; }
				set { printOnLastPage = value; }
			}
		}

		internal class ReportItemCointainer : IRdlElement
		{
			private RReportItems reportItems;
			public RReportItems ReportItems
			{
				get
				{
					return reportItems;
				}
				set
				{
					reportItems = value;
				}
			}

			private RSize? height;
			public RSize? Height
			{
				get { return height; }
				set { height = value; }
			}

			public ReportItemCointainer()
			{
				this.ReportItems = new RReportItems();
			}

			/// <summary>
			/// Write ReportItems, Height
			/// </summary>
			/// <param name="xmlWriter"></param>
			public virtual void WriteTo(XmlWriter xmlWriter)
			{
				if (ReportItems.Count > 0)
				{
					ReportItems.WriteTo(xmlWriter);
				}
				
				if (Height.HasValue)
				{
					xmlWriter.WriteElementString("Height", Height.ToString());
				}
			}
		}

		internal class RBody : ReportItemCointainer
		{
			/// <summary>
			/// Number of columns for the report
			/// </summary>
			//public int Columns;

			/// <summary>
			/// Spacing between each column in multi-column output. Default: 0.5 in
			/// </summary>
			//public DSize ColumnSpacing;

			public RBody()
				: base()
			{
				Height = new Unit(2, UnitType.Inch);
			}

			public override void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("Body");
				{
					base.WriteTo(xmlWriter);
				}
				xmlWriter.WriteEndElement();
			}
		}

		#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