From f9fc75461142acf8108356d84d0f1967b414ed77 Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Walter?= Date: Tue, 8 Oct 2013 12:54:35 +0000 Subject: [PATCH] Bug 55081: patch for missing function WEEKNUM Add simple spreadsheet with Excel 2003, and another with 2013 (both fresh files) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1530256 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/atp/AnalysisToolPak.java | 2 +- .../poi/ss/formula/functions/WeekNum.java | 88 ++++++++++++++++++ .../TestWeekNumFunctionsFromSpreadsheet.java | 30 ++++++ ...stWeekNumFunctionsFromSpreadsheet2013.java | 31 ++++++ test-data/spreadsheet/FormulaEvalTestData.xls | Bin 169984 -> 169984 bytes .../WeekNumFunctionTestCaseData.xls | Bin 0 -> 35840 bytes .../WeekNumFunctionTestCaseData2013.xls | Bin 0 -> 29696 bytes 7 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 src/java/org/apache/poi/ss/formula/functions/WeekNum.java create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet.java create mode 100644 src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet2013.java create mode 100644 test-data/spreadsheet/WeekNumFunctionTestCaseData.xls create mode 100644 test-data/spreadsheet/WeekNumFunctionTestCaseData2013.xls diff --git a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java index b866c61bf3..1a191b174d 100644 --- a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java +++ b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java @@ -156,7 +156,7 @@ public final class AnalysisToolPak implements UDFFinder { r(m, "TBILLEQ", null); r(m, "TBILLPRICE", null); r(m, "TBILLYIELD", null); - r(m, "WEEKNUM", null); + r(m, "WEEKNUM", WeekNum.instance); r(m, "WORKDAY", WorkdayFunction.instance); r(m, "XIRR", null); r(m, "XNPV", null); diff --git a/src/java/org/apache/poi/ss/formula/functions/WeekNum.java b/src/java/org/apache/poi/ss/formula/functions/WeekNum.java new file mode 100644 index 0000000000..e678104a23 --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/functions/WeekNum.java @@ -0,0 +1,88 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.formula.functions; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.*; +import org.apache.poi.ss.usermodel.DateUtil; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +/** + * Implementation for Excel WeekNum() function.

+ *

+ * Syntax:
WeekNum (Serial_num,Return_type)
+ *

+ * Returns a number that indicates where the week falls numerically within a year. + *

+ *

+ * Serial_num is a date within the week. Dates should be entered by using the DATE function, + * or as results of other formulas or functions. For example, use DATE(2008,5,23) + * for the 23rd day of May, 2008. Problems can occur if dates are entered as text. + * Return_type is a number that determines on which day the week begins. The default is 1. + * 1 Week begins on Sunday. Weekdays are numbered 1 through 7. + * 2 Week begins on Monday. Weekdays are numbered 1 through 7. + * + * @author cedric dot walter @ gmail dot com + */ +public class WeekNum extends Fixed2ArgFunction implements FreeRefFunction { + + public static final FreeRefFunction instance = new WeekNum(); + + public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval serialNumVE, ValueEval returnTypeVE) { + double serialNum = 0.0; + try { + serialNum = NumericFunction.singleOperandEvaluate(serialNumVE, srcRowIndex, srcColumnIndex); + } catch (EvaluationException e) { + return ErrorEval.VALUE_INVALID; + } + Calendar serialNumCalendar = new GregorianCalendar(); + serialNumCalendar.setTime(DateUtil.getJavaDate(serialNum, false)); + + int returnType = 0; + try { + ValueEval ve = OperandResolver.getSingleValue(returnTypeVE, srcRowIndex, srcColumnIndex); + returnType = OperandResolver.coerceValueToInt(ve); + } catch (EvaluationException e) { + return ErrorEval.NUM_ERROR; + } + + if (returnType != 1 && returnType != 2) { + return ErrorEval.NUM_ERROR; + } + + return new NumberEval(this.getWeekNo(serialNumCalendar, returnType)); + } + + public int getWeekNo(Calendar cal, int weekStartOn) { + if (weekStartOn == 1) { + cal.setFirstDayOfWeek(Calendar.SUNDAY); + } else { + cal.setFirstDayOfWeek(Calendar.MONDAY); + } + return cal.get(Calendar.WEEK_OF_YEAR); + } + + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { + if (args.length == 2) { + return evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]); + } + return ErrorEval.VALUE_INVALID; + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet.java b/src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet.java new file mode 100644 index 0000000000..77b832ea14 --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet.java @@ -0,0 +1,30 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.formula.functions; + +/** + * Tests WeekNum() as loaded from a test data spreadsheet.

+ * + * @author cedric dot walter @ gmail dot com + */ +public class TestWeekNumFunctionsFromSpreadsheet extends BaseTestFunctionsFromSpreadsheet { + + protected String getFilename() { + return "WeekNumFunctionTestCaseData.xls"; + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet2013.java b/src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet2013.java new file mode 100644 index 0000000000..d7d286468a --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestWeekNumFunctionsFromSpreadsheet2013.java @@ -0,0 +1,31 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.ss.formula.functions; + +/** + * Tests WeekNum() as loaded from a test data 2013 excel spreadsheet.

+ * + * @author cedric dot walter @ gmail dot com + */ +public class TestWeekNumFunctionsFromSpreadsheet2013 extends BaseTestFunctionsFromSpreadsheet { + + protected String getFilename() { + //Only open this file with Excel 2013 to keep binary specific to that version + return "WeekNumFunctionTestCaseData2013.xls"; + } +} diff --git a/test-data/spreadsheet/FormulaEvalTestData.xls b/test-data/spreadsheet/FormulaEvalTestData.xls index 434a04f7472e1b63c66e90682cb16d9d6e78ad63..df81bc8a78f2b08e0e17ea7794fd86cc234fe20c 100644 GIT binary patch delta 9119 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/WeekNumFunctionTestCaseData2013.xls b/test-data/spreadsheet/WeekNumFunctionTestCaseData2013.xls new file mode 100644 index 0000000000000000000000000000000000000000..2afd0262dc82c0ccd94e3f20daac109f1c29c28a GIT binary patch literal 29696 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