]> source.dussan.org Git - poi.git/commitdiff
DAYS360 function needs to support dates provided as strings as well as a nums
authorPJ Fanning <fanningpj@apache.org>
Sat, 28 May 2022 18:26:21 +0000 (18:26 +0000)
committerPJ Fanning <fanningpj@apache.org>
Sat, 28 May 2022 18:26:21 +0000 (18:26 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901364 13f79535-47bb-0310-9956-ffa450edef68

poi/src/main/java/org/apache/poi/ss/formula/functions/Days.java
poi/src/main/java/org/apache/poi/ss/formula/functions/Days360.java
poi/src/test/java/org/apache/poi/ss/formula/functions/TestDays360.java

index a5a55943b2e96721390806df00d034ed9c1343bd..cce818089007ff2d7e854568aa1df2640161a049 100644 (file)
@@ -73,7 +73,7 @@ public class Days implements FreeRefFunction {
         return ChronoUnit.DAYS.between(startDate, endDate);
     }
 
-    private static LocalDate getDate(ValueEval eval, int srcRowIndex, int srcColumnIndex) throws EvaluationException {
+    static LocalDate getDate(ValueEval eval, int srcRowIndex, int srcColumnIndex) throws EvaluationException {
         ValueEval ve = OperandResolver.getSingleValue(eval, srcRowIndex, srcColumnIndex);
         try {
             double d0 = NumericFunction.singleOperandEvaluate(ve, srcRowIndex, srcColumnIndex);
index e86b23be896fdce91a97f742ba53d4d0b5cfc477..cfb4fe81942fc0507304d658f814f36664cc0c29 100644 (file)
@@ -16,6 +16,7 @@
 ==================================================================== */
 package org.apache.poi.ss.formula.functions;
 
+import java.time.LocalDate;
 import java.util.Calendar;
 
 import org.apache.poi.ss.formula.eval.EvaluationException;
@@ -69,23 +70,23 @@ public class Days360 extends Var2or3ArgFunction {
     @Override
     public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
         try {
-            double d0 = NumericFunction.singleOperandEvaluate(arg0, srcRowIndex, srcColumnIndex);
-            double d1 = NumericFunction.singleOperandEvaluate(arg1, srcRowIndex, srcColumnIndex);
-            return new NumberEval(evaluate(d0, d1, false));
+            LocalDate d0 = Days.getDate(arg0, srcRowIndex, srcColumnIndex);
+            LocalDate d1 = Days.getDate(arg1, srcRowIndex, srcColumnIndex);
+            return new NumberEval(evaluate(DateUtil.getExcelDate(d0), DateUtil.getExcelDate(d1), false));
         } catch (EvaluationException e) {
             return e.getErrorEval();
         }
     }
 
     @Override
-    public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1,
-            ValueEval arg2) {
+    public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1, ValueEval arg2) {
         try {
-            double d0 = NumericFunction.singleOperandEvaluate(arg0, srcRowIndex, srcColumnIndex);
-            double d1 = NumericFunction.singleOperandEvaluate(arg1, srcRowIndex, srcColumnIndex);
+            LocalDate d0 = Days.getDate(arg0, srcRowIndex, srcColumnIndex);
+            LocalDate d1 = Days.getDate(arg1, srcRowIndex, srcColumnIndex);
             ValueEval ve = OperandResolver.getSingleValue(arg2, srcRowIndex, srcColumnIndex);
             Boolean method = OperandResolver.coerceValueToBoolean(ve, false);
-            return new NumberEval(evaluate(d0, d1, method != null && method.booleanValue()));
+            return new NumberEval(evaluate(DateUtil.getExcelDate(d0), DateUtil.getExcelDate(d1),
+                    method != null && method.booleanValue()));
         } catch (EvaluationException e) {
             return e.getErrorEval();
         }
index 161b7b98b0805d93c5cb8a9615b8aa3598a36952..824bc37afe507f39c640a050f28e96b40a9ca18f 100644 (file)
 
 package org.apache.poi.ss.formula.functions;
 
+import static org.apache.poi.ss.util.Utils.assertDouble;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.io.IOException;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
 
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.formula.eval.BoolEval;
 import org.apache.poi.ss.formula.eval.NumberEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
@@ -74,6 +81,18 @@ final class TestDays360 {
         confirm(30, makeDate(2011, 1, 1), makeDate(2011, 2, 1), false);
     }
 
+    @Test
+    void testDatesAsStrings() throws Exception {
+        try (HSSFWorkbook wb = new HSSFWorkbook()) {
+            HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
+            HSSFSheet sheet = wb.createSheet();
+            HSSFRow row = sheet.createRow(0);
+            HSSFCell cell = row.createCell(0);
+            assertDouble(fe, cell, "DAYS360(\"1-FEB-2021\", \"15-MAR-2021\")", 44, 0.00000000001);
+            assertDouble(fe, cell, "DAYS360(\"1-FEB-2021\", \"15-MAR-2021\", FALSE)", 44, 0.00000000001);
+        }
+    }
+
     private static void confirm(int expResult, int y1, int m1, int d1, int y2, int m2, int d2) {
         confirm(expResult, makeDate(y1, m1, d1), makeDate(y2, m2, d2), false);
         confirm(-expResult, makeDate(y2, m2, d2), makeDate(y1, m1, d1), false);