blob: b2fb0cbbb05a398d80b5c8a12e9acce58b72cc98 [file] [log] [blame]
/*
* 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;
}
}
}