blob: f5c1b053f0a6fb76bc1256b68986d895a0ae7009 [file] [log] [blame]
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);
}
}