| using System; | 
 | using System.Collections.Generic; | 
 | using OfficeOpenXml.FormulaParsing.ExpressionGraph; | 
 |  | 
 | namespace OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; | 
 |  | 
 | public class IsoWeekNum : ExcelFunction { | 
 |   public override CompileResult Execute( | 
 |       IEnumerable<FunctionArgument> arguments, | 
 |       ParsingContext context) { | 
 |     ValidateArguments(arguments, 1); | 
 |     var dateInt = ArgToInt(arguments, 0); | 
 |     var date = System.DateTime.FromOADate(dateInt); | 
 |     return CreateResult(WeekNumber(date), DataType.Integer); | 
 |   } | 
 |  | 
 |   /// <summary> | 
 |   /// This implementation was found on http://stackoverflow.com/questions/1285191/get-week-of-date-from-linq-query | 
 |   /// </summary> | 
 |   /// <param name="fromDate"></param> | 
 |   /// <returns></returns> | 
 |   private int WeekNumber(System.DateTime fromDate) { | 
 |     // Get jan 1st of the year | 
 |     var startOfYear = fromDate.AddDays(-fromDate.Day + 1).AddMonths(-fromDate.Month + 1); | 
 |     // Get dec 31st of the year | 
 |     var endOfYear = startOfYear.AddYears(1).AddDays(-1); | 
 |     // ISO 8601 weeks start with Monday | 
 |     // The first week of a year includes the first Thursday | 
 |     // DayOfWeek returns 0 for sunday up to 6 for saterday | 
 |     int[] iso8601Correction = { 6, 7, 8, 9, 10, 4, 5 }; | 
 |     int nds = fromDate.Subtract(startOfYear).Days + iso8601Correction[(int)startOfYear.DayOfWeek]; | 
 |     int wk = nds / 7; | 
 |     switch (wk) { | 
 |       case 0: | 
 |         // Return weeknumber of dec 31st of the previous year | 
 |         return WeekNumber(startOfYear.AddDays(-1)); | 
 |       case 53: | 
 |         // If dec 31st falls before thursday it is week 01 of next year | 
 |         if (endOfYear.DayOfWeek < DayOfWeek.Thursday) { | 
 |           return 1; | 
 |         } | 
 |         return wk; | 
 |       default: | 
 |         return wk; | 
 |     } | 
 |   } | 
 | } |