From: PJ Fanning Date: Sat, 7 Aug 2021 11:52:35 +0000 (+0000) Subject: fix TextJoin use case that was not handled X-Git-Tag: REL_5_1_0~73 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=87ea84cf48cc115994b4dfa2f2c6ee00febe1d92;p=poi.git fix TextJoin use case that was not handled git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1892070 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/TextJoinFunction.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/TextJoinFunction.java index 8cd588715a..85a527261f 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/atp/TextJoinFunction.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/TextJoinFunction.java @@ -96,14 +96,14 @@ final class TextJoinFunction implements FreeRefFunction { if (delimiterArgs.size() == 0) { return new StringEval(String.join("", textValues)); } else if (delimiterArgs.size() == 1) { - String delimiter = OperandResolver.coerceValueToString(delimiterArgs.get(0)); + String delimiter = coerceValueToString(delimiterArgs.get(0)); return new StringEval(String.join(delimiter, textValues)); } else { //https://support.microsoft.com/en-us/office/textjoin-function-357b449a-ec91-49d0-80c3-0e8fc845691c //see example 3 to see why this is needed List delimiters = new ArrayList<>(); for (ValueEval delimiterArg: delimiterArgs) { - delimiters.add(OperandResolver.coerceValueToString(delimiterArg)); + delimiters.add(coerceValueToString(delimiterArg)); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < textValues.size(); i++) { @@ -120,6 +120,10 @@ final class TextJoinFunction implements FreeRefFunction { } } + private String coerceValueToString(ValueEval eval) { + return (eval instanceof MissingArgEval) ? "" : OperandResolver.coerceValueToString(eval); + } + //https://support.microsoft.com/en-us/office/textjoin-function-357b449a-ec91-49d0-80c3-0e8fc845691c //in example 3, the delimiter is defined by a large area but only the last row of that area seems to be used //this is why lastRowOnly is supported diff --git a/poi/src/test/java/org/apache/poi/ss/formula/atp/TestTextJoinFunction.java b/poi/src/test/java/org/apache/poi/ss/formula/atp/TestTextJoinFunction.java index 6ece0eae71..8e8c15a69f 100644 --- a/poi/src/test/java/org/apache/poi/ss/formula/atp/TestTextJoinFunction.java +++ b/poi/src/test/java/org/apache/poi/ss/formula/atp/TestTextJoinFunction.java @@ -201,6 +201,8 @@ public class TestTextJoinFunction { HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100); confirmResult(fe, cell, "TEXTJOIN(A8:D8, TRUE, A2:D7)", "Tulsa,OK,74133,US;Seattle,WA,98109,US;Iselin,NJ,08830,US;Fort Lauderdale,FL,33309,US;Tempe,AZ,85285,US;end"); + confirmResult(fe, cell, "TEXTJOIN(, TRUE, A2:D7)", + "TulsaOK74133USSeattleWA98109USIselinNJ08830USFort LauderdaleFL33309USTempeAZ85285USend"); } }