| /*  | 
 |  * You may amend and distribute as you like, but don't remove this header! | 
 |  *  | 
 |  * EPPlus provides server-side generation of Excel 2007 spreadsheets. | 
 |  * See http://www.codeplex.com/EPPlus for details. | 
 |  *  | 
 |  * 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 | 
 |  *  | 
 |  * 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 | 
 |  * ****************************************************************************** | 
 |  * Mats Alm   		                Added       		        2011-01-08 | 
 |  *******************************************************************************/ | 
 | using System; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using System.Text; | 
 | using System.IO; | 
 | using OfficeOpenXml; | 
 | using OfficeOpenXml.DataValidation; | 
 | using OfficeOpenXml.DataValidation.Contracts; | 
 |  | 
 | namespace EPPlusSamples | 
 | { | 
 |     /// <summary> | 
 |     /// This sample shows how to use data validation | 
 |     /// </summary> | 
 |     class Sample11 | 
 |     { | 
 |         public static string RunSample11(DirectoryInfo outputDir) | 
 |         { | 
 |             //Create a Sample10 directory... | 
 |             if (!Directory.Exists(outputDir.FullName + @"\Sample11")) | 
 |             { | 
 |                 outputDir.CreateSubdirectory("Sample11"); | 
 |             } | 
 |             outputDir = new DirectoryInfo(outputDir + @"\Sample11"); | 
 |  | 
 |             //create FileInfo object... | 
 |             FileInfo output = new FileInfo(outputDir.FullName + @"\Output.xlsx"); | 
 |             if (output.Exists) | 
 |             { | 
 |                 output.Delete(); | 
 |                 output = new FileInfo(outputDir.FullName + @"\Output.xlsx"); | 
 |             } | 
 |  | 
 |             using (var package = new ExcelPackage(output)) | 
 |             { | 
 |                 AddIntegerValidation(package); | 
 |                 AddListValidationFormula(package); | 
 |                 AddListValidationValues(package); | 
 |                 AddTimeValidation(package); | 
 |                 AddDateTimeValidation(package); | 
 |                 ReadExistingValidationsFromPackage(package); | 
 |                 package.SaveAs(output); | 
 |             } | 
 |             return output.FullName; | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Adds integer validation | 
 |         /// </summary> | 
 |         /// <param name="file"></param> | 
 |         private static void AddIntegerValidation(ExcelPackage package) | 
 |         { | 
 |             var sheet = package.Workbook.Worksheets.Add("integer"); | 
 |             // add a validation and set values | 
 |             var validation = sheet.DataValidations.AddIntegerValidation("A1:A2"); | 
 |             // Alternatively: | 
 |             //var validation = sheet.Cells["A1:A2"].DataValidation.AddIntegerDataValidation(); | 
 |             validation.ErrorStyle = ExcelDataValidationWarningStyle.stop; | 
 |             validation.PromptTitle = "Enter a integer value here"; | 
 |             validation.Prompt = "Value should be between 1 and 5"; | 
 |             validation.ShowInputMessage = true; | 
 |             validation.ErrorTitle = "An invalid value was entered"; | 
 |             validation.Error = "Value must be between 1 and 5"; | 
 |             validation.ShowErrorMessage = true; | 
 |             validation.Operator = ExcelDataValidationOperator.between; | 
 |             validation.Formula.Value = 1; | 
 |             validation.Formula2.Value = 5; | 
 |  | 
 |             Console.WriteLine("Added sheet for integer validation"); | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Adds a list validation where the list source is a formula | 
 |         /// </summary> | 
 |         /// <param name="package"></param> | 
 |         private static void AddListValidationFormula(ExcelPackage package) | 
 |         { | 
 |             var sheet = package.Workbook.Worksheets.Add("list formula"); | 
 |             sheet.Cells["B1"].Style.Font.Bold = true; | 
 |             sheet.Cells["B1"].Value = "Source values"; | 
 |             sheet.Cells["B2"].Value = 1; | 
 |             sheet.Cells["B3"].Value = 2; | 
 |             sheet.Cells["B4"].Value = 3; | 
 |              | 
 |             // add a validation and set values | 
 |             var validation = sheet.DataValidations.AddListValidation("A1"); | 
 |             // Alternatively: | 
 |             // var validation = sheet.Cells["A1"].DataValidation.AddListDataValidation(); | 
 |             validation.ShowErrorMessage = true; | 
 |             validation.ErrorStyle = ExcelDataValidationWarningStyle.warning; | 
 |             validation.ErrorTitle = "An invalid value was entered"; | 
 |             validation.Error = "Select a value from the list"; | 
 |             validation.Formula.ExcelFormula = "B2:B4"; | 
 |  | 
 |             Console.WriteLine("Added sheet for list validation with formula"); | 
 |              | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Adds a list validation where the selectable values are set | 
 |         /// </summary> | 
 |         /// <param name="package"></param> | 
 |         private static void AddListValidationValues(ExcelPackage package) | 
 |         { | 
 |             var sheet = package.Workbook.Worksheets.Add("list values"); | 
 |  | 
 |             // add a validation and set values | 
 |             var validation = sheet.DataValidations.AddListValidation("A1"); | 
 |             validation.ShowErrorMessage = true; | 
 |             validation.ErrorStyle = ExcelDataValidationWarningStyle.warning; | 
 |             validation.ErrorTitle = "An invalid value was entered"; | 
 |             validation.Error = "Select a value from the list"; | 
 |             for (var i = 1; i <= 5; i++) | 
 |             { | 
 |                 validation.Formula.Values.Add(i.ToString()); | 
 |             } | 
 |             Console.WriteLine("Added sheet for list validation with values"); | 
 |  | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Adds a time validation | 
 |         /// </summary> | 
 |         /// <param name="package"></param> | 
 |         private static void AddTimeValidation(ExcelPackage package) | 
 |         { | 
 |             var sheet = package.Workbook.Worksheets.Add("time"); | 
 |             // add a validation and set values | 
 |             var validation = sheet.DataValidations.AddTimeValidation("A1"); | 
 |             // Alternatively: | 
 |             // var validation = sheet.Cells["A1"].DataValidation.AddTimeDataValidation(); | 
 |             validation.ShowErrorMessage = true; | 
 |             validation.ErrorStyle = ExcelDataValidationWarningStyle.stop; | 
 |             validation.ShowInputMessage = true; | 
 |             validation.PromptTitle = "Enter time in format HH:MM:SS"; | 
 |             validation.Prompt = "Should be greater than 13:30:10"; | 
 |             validation.Operator = ExcelDataValidationOperator.greaterThan; | 
 |             var time = validation.Formula.Value; | 
 |             time.Hour = 13; | 
 |             time.Minute = 30; | 
 |             time.Second = 10; | 
 |             Console.WriteLine("Added sheet for time validation"); | 
 |         } | 
 |  | 
 |         private static void AddDateTimeValidation(ExcelPackage package) | 
 |         { | 
 |             var sheet = package.Workbook.Worksheets.Add("datetime"); | 
 |             // add a validation and set values | 
 |             var validation = sheet.DataValidations.AddDateTimeValidation("A1"); | 
 |             // Alternatively: | 
 |             // var validation = sheet.Cells["A1"].DataValidation.AddDateTimeDataValidation(); | 
 |             validation.ShowErrorMessage = true; | 
 |             validation.ErrorStyle = ExcelDataValidationWarningStyle.stop; | 
 |             validation.Error = "Invalid date!"; | 
 |             validation.ShowInputMessage = true; | 
 |             validation.Prompt = "Enter a date greater than todays date here"; | 
 |             validation.Operator = ExcelDataValidationOperator.greaterThan; | 
 |             validation.Formula.Value = DateTime.Now.Date; | 
 |             Console.WriteLine("Added sheet for date time validation"); | 
 |  | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// shows details about all existing validations in the entire workbook | 
 |         /// </summary> | 
 |         /// <param name="package"></param> | 
 |         private static void ReadExistingValidationsFromPackage(ExcelPackage package) | 
 |         { | 
 |             var sheet = package.Workbook.Worksheets.Add("Package validations"); | 
 |             // print headers | 
 |             sheet.Cells["A1:E1"].Style.Font.Bold = true; | 
 |             sheet.Cells["A1"].Value = "Type"; | 
 |             sheet.Cells["B1"].Value = "Address"; | 
 |             sheet.Cells["C1"].Value = "Operator"; | 
 |             sheet.Cells["D1"].Value = "Formula1"; | 
 |             sheet.Cells["E1"].Value = "Formula2"; | 
 |  | 
 |             int row = 2; | 
 |             foreach (var otherSheet in package.Workbook.Worksheets) | 
 |             { | 
 |                 if(otherSheet == sheet) | 
 |                 { | 
 |                     continue; | 
 |                 } | 
 |                 foreach (var dataValidation in otherSheet.DataValidations) | 
 |                 { | 
 |                     sheet.Cells["A" + row.ToString()].Value = dataValidation.ValidationType.Type.ToString(); | 
 |                     sheet.Cells["B" + row.ToString()].Value = dataValidation.Address.Address; | 
 |                     if (dataValidation.AllowsOperator) | 
 |                     { | 
 |                         sheet.Cells["C" + row.ToString()].Value = ((IExcelDataValidationWithOperator)dataValidation).Operator.ToString(); | 
 |                     } | 
 |                     // type casting is needed to get validationtype-specific values | 
 |                     switch(dataValidation.ValidationType.Type) | 
 |                     { | 
 |                         case eDataValidationType.Whole: | 
 |                             PrintWholeValidationDetails(sheet, (IExcelDataValidationInt)dataValidation, row); | 
 |                             break; | 
 |                         case eDataValidationType.List: | 
 |                             PrintListValidationDetails(sheet, (IExcelDataValidationList)dataValidation, row); | 
 |                             break; | 
 |                         case eDataValidationType.Time: | 
 |                             PrintTimeValidationDetails(sheet, (ExcelDataValidationTime)dataValidation, row); | 
 |                             break; | 
 |                         default: | 
 |                             // the rest of the types are not supported in this sample, but I hope you get the picture... | 
 |                             break; | 
 |                     } | 
 |                     row++; | 
 |                 } | 
 |             } | 
 |         } | 
 |  | 
 |         private static void PrintWholeValidationDetails(ExcelWorksheet sheet, IExcelDataValidationInt wholeValidation, int row) | 
 |         { | 
 |             sheet.Cells["D" + row.ToString()].Value = wholeValidation.Formula.Value.HasValue ? wholeValidation.Formula.Value.Value.ToString() : wholeValidation.Formula.ExcelFormula; | 
 |             sheet.Cells["E" + row.ToString()].Value = wholeValidation.Formula2.Value.HasValue ? wholeValidation.Formula2.Value.Value.ToString() : wholeValidation.Formula2.ExcelFormula; | 
 |         } | 
 |  | 
 |         private static void PrintListValidationDetails(ExcelWorksheet sheet, IExcelDataValidationList listValidation, int row) | 
 |         { | 
 |             string value = string.Empty; | 
 |             // if formula is used - show it... | 
 |             if(!string.IsNullOrEmpty(listValidation.Formula.ExcelFormula)) | 
 |             { | 
 |                 value = listValidation.Formula.ExcelFormula; | 
 |             } | 
 |             else | 
 |             { | 
 |                 // otherwise - show the values from the list collection | 
 |                 var sb = new StringBuilder(); | 
 |                 foreach(var listValue in listValidation.Formula.Values) | 
 |                 { | 
 |                     if(sb.Length > 0) | 
 |                     { | 
 |                         sb.Append(","); | 
 |                     } | 
 |                     sb.Append(listValue); | 
 |                 } | 
 |                 value = sb.ToString(); | 
 |             } | 
 |             sheet.Cells["D" + row.ToString()].Value = value; | 
 |         } | 
 |  | 
 |         private static void PrintTimeValidationDetails(ExcelWorksheet sheet, ExcelDataValidationTime validation, int row) | 
 |         { | 
 |             var value1 = string.Empty; | 
 |             if(!string.IsNullOrEmpty(validation.Formula.ExcelFormula)) | 
 |             { | 
 |                 value1 = validation.Formula.ExcelFormula; | 
 |             } | 
 |             else | 
 |             { | 
 |                 value1 = string.Format("{0}:{1}:{2}", validation.Formula.Value.Hour, validation.Formula.Value.Minute, validation.Formula.Value.Second ?? 0); | 
 |             } | 
 |             sheet.Cells["D" + row.ToString()].Value = value1; | 
 |         } | 
 |     } | 
 | } |