| /******************************************************************************* | 
 |  * You may amend and distribute as you like, but don't remove this header! | 
 |  *  | 
 |  * All rights reserved. | 
 |  *  | 
 |  * EPPlus is an Open Source project provided under the  | 
 |  * GNU General Public License (GPL) as published by the  | 
 |  * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
 |  *  | 
 |  * EPPlus provides server-side generation of Excel 2007 spreadsheets. | 
 |  * See http://www.codeplex.com/EPPlus for details. | 
 |  * | 
 |  * | 
 |  *  | 
 |  * The GNU General Public License can be viewed at http://www.opensource.org/licenses/gpl-license.php | 
 |  * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html | 
 |  *  | 
 |  * The code for this project may be used and redistributed by any means PROVIDING it is  | 
 |  * not sold for profit without the author's written consent, and providing that this notice  | 
 |  * and the author's name and all copyright notices remain intact. | 
 |  *  | 
 |  * All code and executables are provided "as is" with no warranty either express or implied.  | 
 |  * The author accepts no liability for any damage or loss of business that this product may cause. | 
 |  * | 
 |  * | 
 |  * Code change notes: | 
 |  *  | 
 |  * Author							Change						Date | 
 |  ******************************************************************************* | 
 |  * Jan Källman		Added		10-SEP-2009 | 
 |  *******************************************************************************/ | 
 |  | 
 | /* | 
 |  * Sample code demonstrating how to generate Excel spreadsheets on the server using  | 
 |  * Office Open XML and the ExcelPackage wrapper classes. | 
 |  *  | 
 |  * ExcelPackage provides server-side generation of Excel 2007 spreadsheets. | 
 |  * See http://www.codeplex.com/ExcelPackage for details. | 
 |  *  | 
 |  * Sample 3: Creates a workbook based on a template and populates using the database data. | 
 |  *  | 
 |  * Copyright 2007 © Dr John Tunnicliffe  | 
 |  * mailto:dr.john.tunnicliffe@btinternet.com | 
 |  * All rights reserved. | 
 |  *  | 
 |  * All code and executables are provided "as is" with no warranty either express or implied.  | 
 |  * The author accepts no liability for any damage or loss of business that this product may cause. | 
 |  */ | 
 | using System; | 
 | using System.IO; | 
 | using System.Xml; | 
 | using OfficeOpenXml; | 
 | using System.Data.SqlClient; | 
 | using System.Drawing; | 
 | using OfficeOpenXml.Style; | 
 |  | 
 | namespace EPPlusSamples | 
 | { | 
 | 	class Sample3 | 
 | 	{ | 
 | 		/// <summary> | 
 | 		/// Sample 3 - creates a workbook and populates using data from the AdventureWorks database | 
 | 		/// This sample requires the AdventureWorks database.   | 
 |         /// This one is from the orginal Excelpackage sample project, but without the template | 
 | 		/// </summary> | 
 | 		/// <param name="outputDir">The output directory</param> | 
 | 		/// <param name="templateDir">The location of the sample template</param> | 
 | 		/// <param name="connectionString">The connection string to your copy of the AdventureWorks database</param> | 
 | 		public static string RunSample3(DirectoryInfo outputDir, string connectionString) | 
 | 		{ | 
 | 			 | 
 |             string file = outputDir.FullName + @"\sample3.xlsx"; | 
 |             if (File.Exists(file)) File.Delete(file); | 
 |             FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample3.xlsx"); | 
 |  | 
 | 			// ok, we can run the real code of the sample now | 
 | 			using (ExcelPackage xlPackage = new ExcelPackage(newFile)) | 
 | 			{ | 
 | 				// uncomment this line if you want the XML written out to the outputDir | 
 | 				//xlPackage.DebugMode = true;  | 
 |  | 
 | 				// get handle to the existing worksheet | 
 | 				ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.Add("Sales"); | 
 |                 var namedStyle = xlPackage.Workbook.Styles.CreateNamedStyle("HyperLink");   //This one is language dependent | 
 |                 namedStyle.Style.Font.UnderLine = true; | 
 |                 namedStyle.Style.Font.Color.SetColor(Color.Blue); | 
 |                 if (worksheet != null) | 
 | 				{ | 
 | 					const int startRow = 5; | 
 | 					int row = startRow; | 
 |                     //Create Headers and format them  | 
 |                     worksheet.Cells["A1"].Value = "AdventureWorks Inc."; | 
 |                     using (ExcelRange r = worksheet.Cells["A1:G1"]) | 
 |                     { | 
 |                         r.Merge = true; | 
 |                         r.Style.Font.SetFromFont(new Font("Britannic Bold", 22, FontStyle.Italic)); | 
 |                         r.Style.Font.Color.SetColor(Color.White); | 
 |                         r.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.CenterContinuous; | 
 |                         r.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; | 
 |                         r.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(23,55,93)); | 
 |                     } | 
 |                     worksheet.Cells["A2"].Value = "Year-End Sales Report"; | 
 |                     using (ExcelRange r = worksheet.Cells["A2:G2"]) | 
 |                     { | 
 |                         r.Merge = true; | 
 |                         r.Style.Font.SetFromFont(new Font("Britannic Bold", 18, FontStyle.Italic)); | 
 |                         r.Style.Font.Color.SetColor(Color.Black); | 
 |                         r.Style.HorizontalAlignment = ExcelHorizontalAlignment.CenterContinuous; | 
 |                         r.Style.Fill.PatternType = ExcelFillStyle.Solid; | 
 |                         r.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(184,204,228)); | 
 |                     } | 
 |  | 
 |                     worksheet.Cells["A4"].Value = "Name"; | 
 |                     worksheet.Cells["B4"].Value = "Job Title"; | 
 |                     worksheet.Cells["C4"].Value = "Region"; | 
 |                     worksheet.Cells["D4"].Value = "Monthly Quota"; | 
 |                     worksheet.Cells["E4"].Value = "Quota YTD"; | 
 |                     worksheet.Cells["F4"].Value = "Sales YTD"; | 
 |                     worksheet.Cells["G4"].Value = "Quota %"; | 
 |                     worksheet.Cells["A4:G4"].Style.Fill.PatternType = ExcelFillStyle.Solid; | 
 |                     worksheet.Cells["A4:G4"].Style.Fill.BackgroundColor.SetColor(Color.FromArgb(184, 204, 228)); | 
 |                     worksheet.Cells["A4:G4"].Style.Font.Bold = true; | 
 |  | 
 |  | 
 |                     // lets connect to the AdventureWorks sample database for some data | 
 | 					using (SqlConnection sqlConn = new SqlConnection(connectionString)) | 
 | 					{ | 
 | 						sqlConn.Open(); | 
 | 						using (SqlCommand sqlCmd = new SqlCommand("select LastName + ', ' + FirstName AS [Name], EmailAddress, JobTitle, CountryRegionName, ISNULL(SalesQuota,0) AS SalesQuota, ISNULL(SalesQuota,0)*12 AS YearlyQuota, SalesYTD from Sales.vSalesPerson ORDER BY SalesYTD desc", sqlConn)) | 
 | 						{ | 
 | 							using (SqlDataReader sqlReader = sqlCmd.ExecuteReader()) | 
 | 							{ | 
 | 								// get the data and fill rows 5 onwards | 
 | 								while (sqlReader.Read()) | 
 | 								{ | 
 | 									int col = 1; | 
 | 									// our query has the columns in the right order, so simply | 
 | 									// iterate through the columns | 
 | 									for (int i = 0; i < sqlReader.FieldCount; i++) | 
 | 									{ | 
 | 										// use the email address as a hyperlink for column 1 | 
 | 										if (sqlReader.GetName(i) == "EmailAddress") | 
 | 										{ | 
 | 											// insert the email address as a hyperlink for the name | 
 | 											string hyperlink = "mailto:" + sqlReader.GetValue(i).ToString(); | 
 | 											worksheet.Cells[row, 1].Hyperlink = new Uri(hyperlink, UriKind.Absolute); | 
 | 										} | 
 | 										else | 
 | 										{ | 
 | 											// do not bother filling cell with blank data (also useful if we have a formula in a cell) | 
 | 											if (sqlReader.GetValue(i) != null) | 
 | 												worksheet.Cells[row, col].Value = sqlReader.GetValue(i); | 
 | 											col++; | 
 | 										} | 
 | 									} | 
 | 									row++; | 
 | 								} | 
 | 								sqlReader.Close(); | 
 |  | 
 |                                 worksheet.Cells[startRow, 1, row - 1, 1].StyleName = "HyperLink"; | 
 |                                 worksheet.Cells[startRow, 4, row - 1, 6].Style.Numberformat.Format = "[$$-409]#,##0"; | 
 |                                 worksheet.Cells[startRow, 7, row - 1, 7].Style.Numberformat.Format = "0%"; | 
 |  | 
 |                                 worksheet.Cells[startRow, 7, row - 1, 7].FormulaR1C1 = "=IF(RC[-2]=0,0,RC[-1]/RC[-2])"; | 
 |  | 
 |                                 //Set column width | 
 |                                 worksheet.Column(1).Width = 25; | 
 |                                 worksheet.Column(2).Width = 28; | 
 |                                 worksheet.Column(3).Width = 18; | 
 |                                 worksheet.Column(4).Width = 12; | 
 |                                 worksheet.Column(5).Width = 10; | 
 |                                 worksheet.Column(6).Width = 10; | 
 |                                 worksheet.Column(7).Width = 12; | 
 |                             } | 
 | 						} | 
 | 						sqlConn.Close(); | 
 | 					} | 
 |  | 
 |                     // lets set the header text  | 
 | 					worksheet.HeaderFooter.OddHeader.CenteredText = "AdventureWorks Inc. Sales Report"; | 
 | 					// add the page number to the footer plus the total number of pages | 
 | 					worksheet.HeaderFooter.OddFooter.RightAlignedText = | 
 | 						string.Format("Page {0} of {1}", ExcelHeaderFooter.PageNumber, ExcelHeaderFooter.NumberOfPages); | 
 | 					// add the sheet name to the footer | 
 | 					worksheet.HeaderFooter.OddFooter.CenteredText = ExcelHeaderFooter.SheetName; | 
 | 					// add the file path to the footer | 
 | 					worksheet.HeaderFooter.OddFooter.LeftAlignedText = ExcelHeaderFooter.FilePath + ExcelHeaderFooter.FileName; | 
 | 				} | 
 | 				// we had better add some document properties to the spreadsheet  | 
 |  | 
 | 				// set some core property values | 
 | 				xlPackage.Workbook.Properties.Title = "Sample 3"; | 
 | 				xlPackage.Workbook.Properties.Author = "John Tunnicliffe"; | 
 | 				xlPackage.Workbook.Properties.Subject = "ExcelPackage Samples"; | 
 | 				xlPackage.Workbook.Properties.Keywords = "Office Open XML"; | 
 | 				xlPackage.Workbook.Properties.Category = "ExcelPackage Samples"; | 
 | 				xlPackage.Workbook.Properties.Comments = "This sample demonstrates how to create an Excel 2007 file from scratch using the Packaging API and Office Open XML"; | 
 |  | 
 | 				// set some extended property values | 
 | 				xlPackage.Workbook.Properties.Company = "AdventureWorks Inc."; | 
 |                 xlPackage.Workbook.Properties.HyperlinkBase = new Uri("http://www.codeplex.com/MSFTDBProdSamples"); | 
 |  | 
 | 				// set some custom property values | 
 | 				xlPackage.Workbook.Properties.SetCustomPropertyValue("Checked by", "John Tunnicliffe"); | 
 | 				xlPackage.Workbook.Properties.SetCustomPropertyValue("EmployeeID", "1147"); | 
 | 				xlPackage.Workbook.Properties.SetCustomPropertyValue("AssemblyName", "ExcelPackage"); | 
 | 				 | 
 | 				// save the new spreadsheet | 
 | 				xlPackage.Save(); | 
 | 			} | 
 |  | 
 | 			// if you want to take a look at the XML created in the package, simply uncomment the following lines | 
 | 			// These copy the output file and give it a zip extension so you can open it and take a look! | 
 | 			//FileInfo zipFile = new FileInfo(outputDir.FullName + @"\sample3.zip"); | 
 | 			//if (zipFile.Exists) zipFile.Delete(); | 
 | 			//newFile.CopyTo(zipFile.FullName); | 
 |  | 
 | 			return newFile.FullName; | 
 | 		} | 
 | 	} | 
 | } |