| using System; | |
| using System.Collections.Generic; | |
| using System.Globalization; | |
| using System.Linq; | |
| using OfficeOpenXml.FormulaParsing.ExpressionGraph; | |
| namespace OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; | |
| public class Weeknum : ExcelFunction { | |
| public override CompileResult Execute( | |
| IEnumerable<FunctionArgument> arguments, | |
| ParsingContext context) { | |
| ValidateArguments(arguments, 1, eErrorType.Value); | |
| var dateSerial = ArgToDecimal(arguments, 0); | |
| var date = System.DateTime.FromOADate(dateSerial); | |
| var startDay = DayOfWeek.Sunday; | |
| if (arguments.Count() > 1) { | |
| var argStartDay = ArgToInt(arguments, 1); | |
| switch (argStartDay) { | |
| case 1: | |
| startDay = DayOfWeek.Sunday; | |
| break; | |
| case 2: | |
| case 11: | |
| startDay = DayOfWeek.Monday; | |
| break; | |
| case 12: | |
| startDay = DayOfWeek.Tuesday; | |
| break; | |
| case 13: | |
| startDay = DayOfWeek.Wednesday; | |
| break; | |
| case 14: | |
| startDay = DayOfWeek.Thursday; | |
| break; | |
| case 15: | |
| startDay = DayOfWeek.Friday; | |
| break; | |
| case 16: | |
| startDay = DayOfWeek.Saturday; | |
| break; | |
| default: | |
| // Not supported | |
| ThrowExcelErrorValueException(eErrorType.Num); | |
| break; | |
| } | |
| } | |
| if (DateTimeFormatInfo.CurrentInfo == null) { | |
| throw new InvalidOperationException( | |
| "Could not execute Weeknum function because DateTimeFormatInfo.CurrentInfo was null"); | |
| } | |
| var week = DateTimeFormatInfo.CurrentInfo.Calendar.GetWeekOfYear( | |
| date, | |
| CalendarWeekRule.FirstDay, | |
| startDay); | |
| return CreateResult(week, DataType.Integer); | |
| } | |
| } |