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

namespace ReportExporters.Common.Rdlc.Wrapper
{
	internal partial class RdlcWrapper
	{
		internal static string GetReportColumnValue(DataColumn dataColumn)
		{
			return string.Format("=Fields!{0}.Value", dataColumn.ColumnName);
		}

		internal static string GetReportColumnValue(ReportColumn rColumn)
		{
			return string.Format("=Fields!{0}.Value", rColumn.Name);
		}

		private static ReportControlItem GetReportCellControlItem(ReportDataColumn reportDataColumn)
		{
			ReportControlItem toRet = null;

			if (reportDataColumn.DataCellViewType is CellViewImage)
			{
				CellViewImage imgCellView = reportDataColumn.DataCellViewType as CellViewImage;

				RImage rImage = new RImage(
					reportDataColumn.Name,
					true,
					GetReportColumnValue(reportDataColumn),
					imgCellView.Properties
				);

				if (reportDataColumn.HyperlinkColumn != null)
				{
					rImage.ImageBox.Action = new Action(
						GetReportColumnValue(reportDataColumn.HyperlinkColumn));
				}

				toRet = rImage;
			}
			else
			{
				RTextBox rTextbox = new RTextBox(reportDataColumn.Name, GetReportColumnValue(reportDataColumn));

				if (reportDataColumn.HyperlinkColumn != null)
				{
					rTextbox.TextBox.Action = new Action(
						GetReportColumnValue(reportDataColumn.HyperlinkColumn));
				}

				toRet = rTextbox;
			}

			toRet.Item.Style = reportDataColumn.DefaultCellStyle;

			return toRet;
		}

		private static ReportControlItem GetReportHeaderControlItem(ReportDataColumn reportDataColumn)
		{
			ReportControlItem rHeaderItem = null;

			if (reportDataColumn.HeaderCellViewType is CellViewImage)
			{
				CellViewImage imgCellView = reportDataColumn.HeaderCellViewType as CellViewImage;

				RImage rImage = new RImage(
					"header" + reportDataColumn.Name,
					true,
					reportDataColumn.HeaderText,
					imgCellView.Properties
				);

				if ((reportDataColumn.HyperlinkColumn != null) && (reportDataColumn.HeaderCellHyperlink != null))
				{
					rImage.ImageBox.Action = new Action(reportDataColumn.HeaderCellHyperlink);
				}

				rHeaderItem = rImage;
			}
			else
			{
				RTextBox rHeaderTextbox = new RTextBox(
					"header" + reportDataColumn.Name, reportDataColumn.HeaderText);

				if ((reportDataColumn.HyperlinkColumn != null) && (reportDataColumn.HeaderCellHyperlink != null))
				{
					rHeaderTextbox.TextBox.Action = new Action(reportDataColumn.HeaderCellHyperlink);
				}

				rHeaderItem = rHeaderTextbox;
			}

			rHeaderItem.Item.Style = reportDataColumn.HeaderStyle;

			return rHeaderItem;
		}

		internal class RHeader : RTableRowsContainer, IRdlElement
		{
			#region IRdlElement Members

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

			#endregion
		}

		internal class RFooter : RTableRowsContainer, IRdlElement
		{
			#region IRdlElement Members

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

			#endregion
		}

		internal class RTableGroup : IRdlElement
		{
			private RGrouping _grouping;
			public RGrouping Grouping
			{
				get
				{
					return _grouping;
				}
				set
				{
					_grouping = value;
				}
			}

			private RSorting _sorting;
			public RSorting Sorting
			{
				get
				{
					return _sorting;
				}
				set
				{
					_sorting = value;
				}
			}

			private RVisibility _visibility;
			public RVisibility Visibility
			{
				get
				{
					return _visibility;
				}
				set
				{
					_visibility = value;
				}
			}

			private RHeader _header;
			public RHeader Header
			{
				get
				{
					return _header;
				}
				set
				{
					_header = value;
				}
			}

			private RFooter _footer;
			public RFooter Footer
			{
				get
				{
					return _footer;
				}
				set
				{
					_footer = value;
				}
			}

			public RTableGroup()
			{
				this.Grouping = new RGrouping();
			}

			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableGroup");
				{
					Grouping.WriteTo(xmlWriter);

					if (Sorting != null) Sorting.WriteTo(xmlWriter);
					if (Visibility != null) Visibility.WriteTo(xmlWriter);
					if (Header != null) Header.WriteTo(xmlWriter);
					if (Footer != null) Footer.WriteTo(xmlWriter);
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		internal class RTableCell : ReportItemCointainer, IRdlElement
		{
			public RTableCell() : base()
			{
			}

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableCell");
				{
					base.WriteTo(xmlWriter);
				}

				xmlWriter.WriteEndElement();
			}
		}

		internal class RTableColumn : IRdlElement
		{
			private Size _width;
			/// <summary>
			/// Width of table column
			/// </summary>
			public Size Width
			{
				get
				{
					return _width;
				}
				set
				{
					_width = value;
				}
			}

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableColumn");
				{
					xmlWriter.WriteElementString("Width", Width.ToString());
				}
				xmlWriter.WriteEndElement();
			}
		}

		internal class RTableRow : IRdlElement
		{
			private RTableCells _tableCells;
			public RTableCells TableCells
			{
				get
				{
					return _tableCells;
				}
			}

			private Size _height;
			public Size Height
			{
				get { return _height; }
				set { _height = value; }
			}

			private RVisibility _visibility;
			public RVisibility Visibility
			{
				get { return _visibility; }
				set { _visibility = value; }
			}

			public BaseStyle Style
			{
				set
				{
					foreach (RTableCell rTableCell in TableCells)
					{
						foreach (ReportControlItem rItem in rTableCell.ReportItems)
						{
							rItem.Item.Style = value;
						}
					}
				}
			}

			public RTableRow()
			{
				Height = new Unit(0.25, UnitType.Inch);
				_tableCells = new RTableCells();
				Visibility = new RVisibility();
			}

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableRow");
				{
					Visibility.WriteTo(xmlWriter);
					TableCells.WriteTo(xmlWriter);
					xmlWriter.WriteElementString("Height", Height.ToString());
				}
				xmlWriter.WriteEndElement();
			}
		}

		internal class RTableRowsContainer : IRdlElement
		{
			private RTableRows _tableRows;
			public RTableRows TableRows
			{
				get
				{
					return _tableRows;
				}
			}

			private RVisibility _visibility;
			public RVisibility Visibility
			{
				get
				{
					return _visibility;
				}
				set
				{
					_visibility = value;
				}
			}

			public bool IsEmpty
			{
				get
				{
					return (TableRows.Count == 0);
				}
			}

			protected RTableRowsContainer()
			{
				this._tableRows = new RTableRows();
				this._visibility = new RVisibility();
			}

			#region IRdlElement Members

			public virtual void WriteTo(XmlWriter xmlWriter)
			{
				TableRows.WriteTo(xmlWriter);
			}

			#endregion
		}

		/// <summary>
		/// The Details element defines the details rows for a table.
		/// </summary>
		internal class RDetails : RTableRowsContainer, IRdlElement
		{
			private RGrouping _grouping;
			public RGrouping Grouping
			{
				get
				{
					return _grouping;
				}
				set
				{
					_grouping = value;
				}
			}

			private RSorting _sorting;
			public RSorting Sorting
			{
				get
				{
					return _sorting;
				}
				set
				{
					_sorting = value;
				}
			}

			public RDetails()
			{
			}

			public override void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("Details");
				{
					base.WriteTo(xmlWriter);

					if (Grouping != null) Grouping.WriteTo(xmlWriter);
					if (Sorting != null) Sorting.WriteTo(xmlWriter);
					if (Visibility != null) Visibility.WriteTo(xmlWriter);
				}
				xmlWriter.WriteEndElement();
			}
		}

		internal class RTable : RDataRegion
		{
			#region Properties
			
			private RDetails Details;
			private RHeader Header;
			private RFooter Footer;
			
			private RTableGroups TableGroups;
			private RTableColumns TableColumns;
			
			#endregion

			private DataTable SourceDataTable;
			
			private IList<ReportColumn> reportDataColumns;
			public IList<ReportColumn> ReportDataColumns
			{
				get
				{
					return reportDataColumns;
				}
			}

			ReportTableGroupList reportTableGroups;
			
			Size rowHeight;

			private RTable()
				: base()
			{
				this._name = String.Format("table{0}", UniqueIndex);
				Header = new RHeader();
				Details = new RDetails();
				Footer = new RFooter();
				TableColumns = new RTableColumns();
			}

			public RTable(string dataSetName)
				: this()
			{
				DataSetName = dataSetName;
				Item.Width = new Unit(9, UnitType.Inch);
			}

			public RTable(DataTable _sourceDataTable, IList<ReportColumn> _reportDataColumns,
				ReportTableGroupList _reportTableGroups, Size _rowHeight)
				: this()
			{
				this.SourceDataTable = _sourceDataTable;
				this.DataSetName = RDataSet.GetDataSetName(_sourceDataTable);
				this.reportDataColumns = _reportDataColumns;
				this.reportTableGroups = _reportTableGroups;
				this.rowHeight = _rowHeight;
			}

			private void SetUpCells()
			{
				Details.TableRows.Clear();

				if ((reportTableGroups != null) && (reportTableGroups.Count > 0))
				{
					#region apply grouping
					
					TableGroups = new RTableGroups();
					for (int rtgIndex = 0; rtgIndex < reportTableGroups.Count; rtgIndex++)
					{
						ReportTableGroup reportTableGroup = reportTableGroups[rtgIndex];
						//ReportColumn firstColumn = reportTableGroup.ColumnGrouping[0];

						RTableGroup newGroup = new RTableGroup();
						newGroup.Grouping.Name = string.Format("{0}_Group{1}", Name, rtgIndex + 1);

						//Grouping
						foreach (ReportColumn groupingColumn in reportTableGroup.ColumnGrouping)
						{
							RExpression groupingExpression = new RExpression(GetReportColumnValue(groupingColumn));
							newGroup.Grouping.GroupExpressions.Add(groupingExpression);
						}

						//Sorting
						if (reportTableGroup.ColumnSorting.Count > 0)
						{
							RSorting groupSorting = new RSorting();
							foreach (ReportColumn sortingColumn in reportTableGroup.ColumnSorting.Keys)
							{
								RSortBy sortByColumn = new RSortBy();
								sortByColumn.SortExpression = GetReportColumnValue(sortingColumn);
								sortByColumn.Direction = reportTableGroup.ColumnSorting[sortingColumn];
								groupSorting.SortBy.Add(sortByColumn);
							}
							newGroup.Sorting = groupSorting;
						}

						//Header
						{
							RHeader groupHeader = new RHeader();
							{
								RTableRow headerRow = new RTableRow();
								{
									BaseStyle hightlightStyleForRow = null;

									foreach (ReportColumn reportColumn in ReportDataColumns)
									{
										if (reportColumn is ReportDataColumn)
										{
											ReportControlItem tbxHeader;

											if (reportTableGroup.ColumnGrouping.Contains(reportColumn))
											{
												tbxHeader = GetReportCellControlItem(reportColumn as ReportDataColumn);
												if (hightlightStyleForRow == null)
												{
													hightlightStyleForRow = tbxHeader.Item.Style;
												}
											}
											else
											{
												tbxHeader = new RTextBox(String.Empty);
											}

											RTableCell rTableCell = new RTableCell();
											rTableCell.ReportItems.Add(tbxHeader);
											headerRow.TableCells.Add(rTableCell);
										}
									}

									if (hightlightStyleForRow != null)
									{
										hightlightStyleForRow.Border.Style = BorderStyle.None;
										headerRow.Style = hightlightStyleForRow;
									}
								}

								groupHeader.TableRows.Add(headerRow);
							}
							newGroup.Header = groupHeader;
						}

						//Footer
						{
							//RFooter groupFooter = new RFooter();
							//newGroup.Footer = groupFooter;
						}

						TableGroups.Add(newGroup);
					}
					
					#endregion
				}

				RTableCell tCell;
				RTableRow tRow = new RTableRow();
				tRow.Height = this.rowHeight;

				foreach (DataColumn dataColumn in SourceDataTable.Columns)
				{
					tCell = new RTableCell();

					ReportControlItem rDataTableItem;
					int columnIndex = SourceDataTable.Columns.IndexOf(dataColumn);
					int reportItemZIndex = columnIndex + 1;

					ReportColumn reportColumn = reportDataColumns[columnIndex];

					if (reportColumn is ReportDataColumn)
					{
						ReportDataColumn reportDataColumn = reportColumn as ReportDataColumn;

						if ((this.reportTableGroups != null) && (this.reportTableGroups.ContainsColumn(reportColumn)))
						{
							rDataTableItem = new RTextBox(string.Empty);
						}
						else
						{
							rDataTableItem = GetReportCellControlItem(reportDataColumn);
						}

						tCell.ReportItems.Add(rDataTableItem);
						tRow.TableCells.Add(tCell);
					}
					else if (reportColumn is ReportHyperlinkColumn)
					{
					}
				}

				Details.TableRows.Add(tRow);
			}

			private void SetUpColumnsHeaders()
			{
				Header.TableRows.Clear();
				RTableCell tCell;
				RTableRow headerRow = new RTableRow();

				double sumColWidthInMillimeters = 0;

				foreach (ReportColumn reportColumn in ReportDataColumns)
				{
					if (reportColumn is ReportDataColumn)
					{
						ReportDataColumn reportDataColumn = reportColumn as ReportDataColumn;

						Unit _widthOfColumn = reportDataColumn.HeaderStyle.Width;
						if (_widthOfColumn.Value == 0)
						{
							_widthOfColumn = reportDataColumn.DefaultCellStyle.Width;
						}
						
						RTableColumn newColumn = new RTableColumn();
						newColumn.Width = _widthOfColumn;
						this.TableColumns.Add(newColumn);
						sumColWidthInMillimeters += MeasureTools.UnitToMillimeters(_widthOfColumn);

						tCell = new RTableCell();

						ReportControlItem rHeaderItem;
						int columnIndex = ReportDataColumns.IndexOf(reportDataColumn);
						int reportItemZIndex = columnIndex + 1;
						
						rHeaderItem = GetReportHeaderControlItem(reportDataColumn);

						//////////////////////					
						tCell.ReportItems.Add(rHeaderItem);
						headerRow.TableCells.Add(tCell);
					}
					else if (reportColumn is ReportHyperlinkColumn)
					{
					}
				}

				Item.Width = new Unit(sumColWidthInMillimeters, UnitType.Mm);
				Header.TableRows.Add(headerRow);
			}

			public override void WriteTo(XmlWriter xmlWriter)
			{
				SetUpColumnsHeaders();
				SetUpCells();

				xmlWriter.WriteStartElement("Table");
				{
					xmlWriter.WriteAttributeString("Name", Name);

					if (TableGroups != null) TableGroups.WriteTo(xmlWriter);
					if (!Details.IsEmpty)
						Details.WriteTo(xmlWriter);
					if (!Header.IsEmpty)
						Header.WriteTo(xmlWriter);
					if (!Footer.IsEmpty)
						Footer.WriteTo(xmlWriter);

					TableColumns.WriteTo(xmlWriter);

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

		}

		#region Collections

		internal class RTableColumns : Collection<RTableColumn>, IRdlElement
		{
			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableColumns");
				{
					foreach (RTableColumn tableColumn in this)
					{
						tableColumn.WriteTo(xmlWriter);
					}
				}
				xmlWriter.WriteEndElement();
			}
		}

		internal class RTableGroups : Collection<RTableGroup>, IRdlElement
		{
			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableGroups");
				{
					foreach (RTableGroup tableGroup in this)
					{
						tableGroup.WriteTo(xmlWriter);
					}
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		internal class RTableRows : Collection<RTableRow>, IRdlElement
		{
			public RTableRows()
			{
			}

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableRows");
				{
					foreach (RTableRow tableRow in this)
					{
						tableRow.WriteTo(xmlWriter);
					}
				}
				xmlWriter.WriteEndElement();
			}
		}

		internal class RTableCells : Collection<RTableCell>, IRdlElement
		{
			#region IRdlElement Members

			public void WriteTo(XmlWriter xmlWriter)
			{
				xmlWriter.WriteStartElement("TableCells");
				{
					foreach (RTableCell tableCell in this)
					{
						tableCell.WriteTo(xmlWriter);
					}
				}
				xmlWriter.WriteEndElement();
			}

			#endregion
		}

		#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