| /* | |
| * 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; | |
| } | |
| } | |
| } |