| using System; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using System.Text; | 
 | 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; | 
 |             } | 
 |         } | 
 |     } | 
 | } |