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