From 861633d37360df6d18a7fcec59472b84e4f4672b Mon Sep 17 00:00:00 2001 From: Andreas Isler Date: Tue, 18 Nov 2025 09:57:28 +0100 Subject: [PATCH] Added parseExcel for backwards compatibility --- .../example/parser/FlowableExcelParser.java | 31 ++++++ .../parser/FlowableExcelParserTest.java | 103 ++++++++++++++++-- ...> flowableExcelParserTestDataBoolean.xlsx} | Bin ...flowableExcelParserTestDataBooleanOld.xlsx | Bin 0 -> 7143 bytes ...> flowableExcelParserTestDataInteger.xlsx} | Bin ...flowableExcelParserTestDataIntegerOld.xlsx | Bin 0 -> 48179 bytes ...=> flowableExcelParserTestDataString.xlsx} | Bin .../flowableExcelParserTestDataStringOld.xlsx | Bin 0 -> 7172 bytes 8 files changed, 127 insertions(+), 7 deletions(-) rename src/test/resources/{flowableExcelParserTestData1.xlsx => flowableExcelParserTestDataBoolean.xlsx} (100%) create mode 100644 src/test/resources/flowableExcelParserTestDataBooleanOld.xlsx rename src/test/resources/{flowableExcelParserTestData3.xlsx => flowableExcelParserTestDataInteger.xlsx} (100%) create mode 100644 src/test/resources/flowableExcelParserTestDataIntegerOld.xlsx rename src/test/resources/{flowableExcelParserTestData2.xlsx => flowableExcelParserTestDataString.xlsx} (100%) create mode 100644 src/test/resources/flowableExcelParserTestDataStringOld.xlsx diff --git a/src/main/java/com/example/parser/FlowableExcelParser.java b/src/main/java/com/example/parser/FlowableExcelParser.java index d56e090..1150503 100644 --- a/src/main/java/com/example/parser/FlowableExcelParser.java +++ b/src/main/java/com/example/parser/FlowableExcelParser.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.LinkedHashMap; @Component @@ -32,6 +33,7 @@ public class FlowableExcelParser { } } + @Deprecated public ArrayList> parseExcelSheet(String excelPath) { try (FileInputStream fileInputStream = new FileInputStream(excelPath)) { Workbook workBook = new XSSFWorkbook(fileInputStream); @@ -120,4 +122,33 @@ public class FlowableExcelParser { } return maxCol; } + + @Deprecated + public ArrayList> parseExcel(String resourcePath) { + try (FileInputStream fileInputStream = new FileInputStream(resourcePath)) { + Workbook workBook = new XSSFWorkbook(fileInputStream); + FormulaEvaluator formulaEvaluator = workBook.getCreationHelper().createFormulaEvaluator(); + ArrayList> sheet = parseSheet(workBook.getSheetAt(0), formulaEvaluator); + ArrayList colHeaders = new ArrayList<>(); + ArrayList> rowList = new ArrayList<>(); + for (int rowIndex = 0; rowIndex < sheet.size(); rowIndex++) { + ArrayList row = sheet.get(rowIndex); + if (rowIndex == 0) { + // Header row + for (Object cell : row) { + colHeaders.add(String.valueOf(cell)); + } + continue; + } + LinkedHashMap rowMap = new LinkedHashMap<>(); + for (int colIndex = 0; colIndex < row.size(); colIndex++) { + rowMap.put(colHeaders.get(colIndex), row.get(colIndex)); + } + rowList.add(rowMap); + } + return rowList; + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/test/java/com/example/parser/FlowableExcelParserTest.java b/src/test/java/com/example/parser/FlowableExcelParserTest.java index 23c07a4..936b2c2 100644 --- a/src/test/java/com/example/parser/FlowableExcelParserTest.java +++ b/src/test/java/com/example/parser/FlowableExcelParserTest.java @@ -28,7 +28,7 @@ class FlowableExcelParserTest { return resourceUrl.getPath(); } - protected Stream getArgumentsFromExcel(String path) { + protected Stream getRowsFromExcel(String path) { ArrayList argumentList = new ArrayList<>(); ArrayList>> book = flowableExcelParser.parseExcelBook(getResourcePath(path)); for (ArrayList> sheet : book) { @@ -45,11 +45,11 @@ class FlowableExcelParserTest { @NotNull protected Stream booleanExcelParserTestData() { - return getArgumentsFromExcel("flowableExcelParserTestData1.xlsx"); + return getRowsFromExcel("flowableExcelParserTestDataBoolean.xlsx"); } @ParameterizedTest @MethodSource("booleanExcelParserTestData") - void booleanExcelParserTest(ArrayList row) { + public void booleanExcelParserTest(ArrayList row) { Boolean valOr = (Boolean) row.get(0) || (Boolean) row.get(1) || (Boolean) row.get(2); Assertions.assertThat(row.get(3)).isEqualTo(valOr); @@ -59,11 +59,11 @@ class FlowableExcelParserTest { @NotNull protected Stream stringExcelParserTestData() { - return getArgumentsFromExcel("flowableExcelParserTestData2.xlsx"); + return getRowsFromExcel("flowableExcelParserTestDataString.xlsx"); } @ParameterizedTest @MethodSource("stringExcelParserTestData") - void stringExcelParserTest(ArrayList row) { + public void stringExcelParserTest(ArrayList row) { String val12 = row.get(0).toString() + row.get(1).toString(); Assertions.assertThat(row.get(3)).isEqualTo(val12); @@ -76,11 +76,11 @@ class FlowableExcelParserTest { @NotNull protected Stream numberExcelParserTestData() { - return getArgumentsFromExcel("flowableExcelParserTestData3.xlsx"); + return getRowsFromExcel("flowableExcelParserTestDataInteger.xlsx"); } @ParameterizedTest @MethodSource("numberExcelParserTestData") - void numberExcelParserTest(ArrayList row) { + public void numberExcelParserTest(ArrayList row) { Double val12 = (Double) row.get(0) + (Double) row.get(1); Assertions.assertThat(row.get(3)).isEqualTo(val12); @@ -90,4 +90,93 @@ class FlowableExcelParserTest { Double val123 = (Double) row.get(0) + (Double) row.get(1) + (Double) row.get(2); Assertions.assertThat(row.get(5)).isEqualTo(val123); } + + @Deprecated + protected Stream getArgumentsFromExcel(String path) { + ArrayList argumentList = new ArrayList<>(); + ArrayList> rowList = flowableExcelParser.parseExcel(getResourcePath(path)); + for (LinkedHashMap row : rowList) { + LinkedHashMap inputMap = new LinkedHashMap<>(); + LinkedHashMap outputMap = new LinkedHashMap<>(); + for (Map.Entry entry : row.entrySet()) { + String key = entry.getKey(); + if (List.of("input1", "input2", "input3").contains(key)) { + inputMap.put(key, entry.getValue()); + } + if (List.of("output1", "output2", "output3").contains(key)) { + outputMap.put(key, entry.getValue()); + } + } + argumentList.add(Arguments.of(inputMap, outputMap)); + } + return argumentList.stream(); + } + + @NotNull + protected Stream booleanExcelParserTestDataProvider() { + return getArgumentsFromExcel("flowableExcelParserTestDataBooleanOld.xlsx"); + } + @ParameterizedTest + @MethodSource("booleanExcelParserTestDataProvider") + public void booleanExcelParserTest(LinkedHashMap inputMap, LinkedHashMap outputMap) { + for (Map.Entry entry : outputMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("output1")) { + Boolean val = (Boolean)inputMap.get("input1") || (Boolean)inputMap.get("input2") || (Boolean)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output2")) { + Boolean val = (Boolean)inputMap.get("input1") && (Boolean)inputMap.get("input2") && (Boolean)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + } + } + + @NotNull + protected Stream stringExcelParserTestDataProvider() { + return getArgumentsFromExcel("flowableExcelParserTestDataStringOld.xlsx"); + } + @ParameterizedTest + @MethodSource("stringExcelParserTestDataProvider") + public void stringExcelParserTest(LinkedHashMap inputMap, LinkedHashMap outputMap) { + for (Map.Entry entry : outputMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("output1")) { + String val = inputMap.get("input1").toString() + inputMap.get("input2").toString(); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output2")) { + String val = inputMap.get("input2").toString() + inputMap.get("input3").toString(); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output3")) { + String val = inputMap.get("input1").toString() + inputMap.get("input2").toString() + inputMap.get("input3").toString(); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + } + } + + @NotNull + protected Stream numberExcelParserTestDataProvider() { + return getArgumentsFromExcel("flowableExcelParserTestDataIntegerOld.xlsx"); + } + @ParameterizedTest + @MethodSource("numberExcelParserTestDataProvider") + public void numberExcelParserTest(LinkedHashMap inputMap, LinkedHashMap outputMap) { + for (Map.Entry entry : outputMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("output1")) { + Double val = (Double)inputMap.get("input1") + (Double)inputMap.get("input2"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output2")) { + Double val = (Double)inputMap.get("input2") + (Double)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output3")) { + Double val = (Double)inputMap.get("input1") + (Double)inputMap.get("input2") + (Double)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + } + } } diff --git a/src/test/resources/flowableExcelParserTestData1.xlsx b/src/test/resources/flowableExcelParserTestDataBoolean.xlsx similarity index 100% rename from src/test/resources/flowableExcelParserTestData1.xlsx rename to src/test/resources/flowableExcelParserTestDataBoolean.xlsx diff --git a/src/test/resources/flowableExcelParserTestDataBooleanOld.xlsx b/src/test/resources/flowableExcelParserTestDataBooleanOld.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4b26fe6e7d5b7fc75bf5b0a772f9d71db1cc92d1 GIT binary patch literal 7143 zcmai31yod9+ol;nkdmQ8kdp2c1VOq>x`rMY7(^OG8l+1~X{4mPhY+a&M7pJ0kPyLd z(7UdD{@=a-J8RC&S!=)V+56dV?dPZ|qM{Ka0RRA`dqOS-NH+ur@!!M+E%^>Xv;fD=g{>oTFynUN507ka-p7r?4@cufk0%2Ya^~%`?+)7}(MS;=8TYgc z6-<(R{P^Yjk@D--3A?dH<7(!O&#G@*k<=710a(NGk13InkW5jL5cmHCDmemFcL&a2 zxIS}ou{U>evgdFIJN&{}r7*y?XClM?j`z-drm?B^;0N}T)G=VC5pAp+ zB}@6hlC}a538wO^+Z&^~htBYHQwI>->YYKtk(kK`p-=u>vYHNd=+2rzTDJoKA0sEq zV`PS2P*V6I6;7WmF#b&xdu4!$J7WY}*z@MsW)DCZ%bL-yxXwM%J3!58zw>&gi1!m{ zep=Y4M`An69-|y3QF?7qrC$CrOC^)e0R<1J%ede*POWeevPA?6Z&CgYr`x}9x`|L; zf|1iS7jf|Z>HWJ4(#uF>GPv5kA^Nr^c135Ca%n@h!to0-pd!e!`$ z2KY^M-^@~*OY($lfm!TkMp&;%47&&Hj85yz>>gQ4Vb>kO@y6gIWCet?HpMs-y-zV^ zth+~;bC0!s20flT(c@NhzO>n24^)`%Q-~_j3=5Y1p`0^<1#F8K5E(V+X<-Wt>}_F3 z)tNAP610}a-6t<3p1R+J#nW?$ot%;p7a)&gGoj(s29kI#dVDWF4ow&;$(e1I`~^FU z%4%6aXi7y4dvaQ{naXqdrNDBsPE?;)iR_02p{fTv!BQEEKf-70zKWL*xWx~~t2NB$ zqp3QaX19HvV~TAed~L=W<9iCcACz&IUVMXH_A;s6`dVgYiKiTz3uGUm4hcOu4) z>ClAlS1Db64(VMjXQ_Ce2^_L5sxOub>kQeF-Ce5Acg)W*eOBKReIGpeR?2(!w&}&P zZ^*NmT+0zi%!ILKsO^OxC;N^V_a)A?H~Jzg9jhZeQ2_nlypiaaH@ez@z#z__SMKYW z?be-fOy|P)+1J%;7Q{%}W=$)!Yuu9N)QI=>pGZ-(xK){vdvQv2YpJq)Q(-Qbw!+YTRQWMJtg`ce>!rp>n-v|5 zj+@$}Pu_?`|2pRdS9k#4ob+h8pK)OCL(>p>Od2(JE#cBOc<)vrLmO)Yy1zUJ z@monxld1%@cAvthd2r<{JCzfXqOd~Z6!3)e8@SlauG4K#9OWZ+7Mxbh&>$O?Tyt`b zQ2>Lztn5H(SP?4G1AHx#Wv8uH0+!-}IzqvXjuj97D#IuW^z}N=;VB@fx;PxzM-rKD zX6i$-O=-*yn>?*9tR6Cz-ykj3SUOweg8O5H`ep zC-$u~?Sjy2>VXqrKv3~mfbfZMw#<;?$bpT3*;m?8O6JxHS=n&Hp*SmFQH>#At|9_K zncP9m)b%pdr58#W_wChsjFQ$ZXbrs%p_efo;V9hrkM=L_WbLPp$UI>P!!&D?l%O4` zRxuq7+l(slYf~pUsfDs_J=ImW`a#6>6xK->8#G>t8uYP%4&L3ldDe1<(!FeZpn10% z@;JEVf@>gqnx!I0ongOv&9`gA;}wqvbm;9PPUWPCHADDqvAYWC$Bo;yBHtw6eAAL= zbCA@=o(K=Aa|?dKI~+=7y-@f00q(|-9PLAMqb9tsC2NC#6d{f zJ2G*Qtq7vA6j9yz)0%|?C0V=79|^;d4b8DsJ9S&N6vGS1daySDN*G+4Mef@|JRcxY zpQ$;y#(1%S!Wy2;8jnd(a`ed6R5G%*JyoIrFS3T$&KYzGA9)XHA)QhXl@Au^L62nd zCn45ipR^vB2cu`hr#8g)M4CK7X;dv`E8F|fvMB3hT^fh|GXmJ>weiIW#8u{!n#lmc9&lHG;^co}j@ z=6mi}%~0CEnysl1(5sn7p38Wi{Bk5(ZF)m6@Du(wbPa4Afe}=-uh#ui#l6R^)n*E9 zChi3&?3gfT95n%veSTm?*$a^)q)&|aLzg8af(hT`!ik&U|^dT1q-8~XgS#bqzGaMje|tAS~> z3Iom{cil!;rGkW9wqE-vV8DIKw_h^UQl)9eqi9zGX1C#M$obm1sk)(eW4WikO1(Ld zGI9xWARgRQd1Idc@?~gXH^^L^iTB~;V5F)XZz+hCoZSD*21YM`Ut|~g^cPo>zEq7p zg@TS+5pA)FAiJ~~h4Goi^BA%dOKQ5Rr{J%ao;>2OGL=-VD0p%%jlO9_VTg8HRckr~ zH+8LT(8N1W_dfGVamrZfouOU<_DQdSAE@SD%?=%pn_Rw5+67$##6j;aeG{Ac2Ah3z zE(c$pNQA9vnS^}GP(8{!Fzv@4*nNUDJh;mM-gFaZ(ju^WJS5#tHVoCexZOk5ewBlC zFn;;TzZviS3?LQf`IBk~E=;O{4eJz@G8o>TDbXHEgq*|+44043Cuf=yQ#{KXGx7X> z_Qj*D%BI_h3cEt`Z&5<}D@v~WJ*W)`( z2-fB9no+RTT&+wzQRENqphhPZiQHvq^BumGYzoNNFa3Tmn3r>3_=wVBbzo;jlaj@2 zfJZ96!4B`1c1M^hYMjH`7VL8C@{u-AR2-5FUkCInne|q0w^J1=D0+&-qRjtc+~7F- z`esm>^%Y4kGX@~E={IDk&`PNKDXytV)Wxf53C!^o^r=uEu;{}g<6~hVZcA* z%a8@v5Q7h>)^5KwTt7XgK>Gml;U0?!0ap1-N<0E#!L*HcQpCE%oYBZtS^v4Y=F+{D7iT$k^5Q84XJ>10=-eKT!=Gq7`P~$v-)+1 z-{-;)IC+N|(RckV$z^x1ioKi3?g+gb;hmFb>n=L8DrNB@rdzTPW$ZHoG_w#cbY^2~ zKg6F~X(k^oT3C-}ol>2`*DL;ZFLHYVWUuq(<#Qb%gMa5U!h_O6d#>u9T8rqAJ4_oN znAlQaUm&z3-;H`~4KbkZobYTO4ZfhY<9CPDk4^6um-NztTWv23i@I;gS$}zFN}a_= zWW=s?G%M5KvBi#slHUAEXDxDM%&=xDK9uIc;r&y#3k<44H}TlXtA&KM_nAVV>FtLGH3K~FD$eYyK7e41 zTy~~xda0Xb>DAs@tLOyZFR=(pzF(5s`9R08Mm$|13pG7F=BcApQprG4V(9|I$6|=r z9pf?xs|;YlLo3k*deNJg$Id=jbCtfiM1i4OfXmV5$wV22G_#K3Ajs;3x~E+amRY&? zH8oto)WBdm)jrvs{CXI}Vz4x(>H4gHhH*Ps=16pYdx`%JxIL=Ym2YAb#d}&3#Zkx= zi8_7(tsYK0ugQ%&Mid+bhR8utmkHUxFjMyE?Y#JP_)y%|0g@`86W8meO{w z@b?IB$M%)$M-V~Yg-mEwBS+V)>Op&r{8cIB+Hphh+T)?9na3zUr+I|y$U5!MH0_ez z5YN&6*Blo&8<17KkWX1>jf1ZBRcltYpasA5Gw_5>TLk!XBN@IkCiXIXAd$6=b1;6q zKe#E~1OLtBM%N>|fo!Xb&Xm4q=|Xgyda1W7IV zMV*2VAvJ!NjcitYfG;p2_j`5|kXND{^I1Zdkjs@muHgHJ69>NUW6qntyPrZIpJM`L zEC)l~A_SWN6=Es*fUdNLGv+aj5Y`bYB15 zoDd+=uBDTOnu`+z%4y-`0=n+Wf;5a2VTcChR5zjdnY_qH!f8ASQUG3{GVy}B%Y@7f zAH&o{o8ayzk*A9@E$iv&7qMx|Zchba2iAg&H0&vX+;+n(8N_F_rK<@U|I=mGFaH>^6v)c+4NE4?Xh% zg3Vl~Q?c)HKO`VE%M;kf_7PBxN0AwV(tB9rY9Tgka7y`HU>aHWU5CtbQ^O#E`P;ma z8IzL3MwA~IwGybj_N0Z%Dzp`F+^d%hFju(mG4z%nnKHcZgJ5J6IoE#u5u|V*@2CM( zMS~KZh$ofw08OBnDl60cZ4>%;x;7Wmz7`qk^j=Y19=c3eCrcBjic zA^DEJMN{g)H>((IO>Ps0^yr~|$PsL`_QD0kc6pOSi@3?c798|4P8ylc8hlYhov(J5 zk>f?Q#?_~Sh|ceN3!fiu@n0(9SuX6K%{$R~fpdJVXMV=^(kCSUWW=lw5#N7~ZL(kM zQU?;aVnXagB;`?t(>k`rw#A7>*BhF4maVR7afAVVvvq|zK1=g-6rYwIjSR? zPA4R3)bHJxb`ufMwSLt59FQpv8RqB?64V|flZ_VuE|6TQ=tQQ20_vZu5&*BlUYUHF za^D@M=KEIM--S(hbPfRe(l@@&8(0fQcDa*2rKys{8XutaN#sRk>5M+cvo`8Z96|@l z_8*l4V4NT1X^pkhcv7lw0?Acnl{6)=Q0+E)<8>Oh+oF5kh$jUFSNXdtg1j%;Tb%M* z>AfHDIaKq6(x#T}A^PNOy2wtv(g31Jqc&U_UKT=GPnQJXyi2WxT(mT2TkJO5kA>E& zpPeWpx8kP*1Srz~uR9n>J2|?799>PcJRl&b(KTQ#+KNt{T(??}?iU#s2$aM4l*RD8 z%kyvHyVze<5cln>gD_*S87!Q9D~Y7n43YWUr^wdjvMYj~~PdDeMNljrvC zC{|0Uk!Gy}LM}z+&hPdv`pV2Ca&*8JYd;)myojNQ?+>I8dKF!%pB^+zg~X9K2?c`F zy93#vhKw(p&I~#Vr!xK7yg|Ng)Q7fjs5LOQxZg^3#L{d%OxRK;RBs*)d%{9X3XR}w zeq(vEl-9A#TbHY1o9NWlTAiUddc*n3^vNG>>6(wX!98_?P*n% z_#w;ZXx4FD64pkQ*NGBEOFy|}iRPC1Sj28lU|a_RG72%$?^hW&`S|Ns8UHOeUTplS zc$1*Mrt5!;HsVqLOy2)#=O(pyO=tfWA4G;n*ttn=|EYYFRk==3zXb+qH)56Vz+ck;tTOMQmvhX*h@u%v|=HvQg_glcX{$Be3Ip_Up zJxR@~8UE?0;P~e@hYq(ZALIs-b^s-^{W9y#X5tIRDnR_`6>G zY2aqIxlYBurTxxN1OGcQ|7qr?i~sjLP7w#{|B+N8Z-|XF@w4hMjjvx{ zcu%=TZ>jP@W>Dh{ZosGl=PW*P-M(Qx^eWf0l6hG){jj!-v(3tn8-31v-h0BPoh@Sz z)+O#sV!l0Safy{1Nq+jk3l}ZMSued9yS7_PF7=v^b`o*tn6NX$qOa*E>o3P_C>5W^ zHr|eUhL$=X5O}{>f8fOCaQ-K8j={0k_?WfO+eMmUQ7FsPSC<(1^bnep6^GMhZ}Csw zG+MRo>DtYWm)4KHrzK@|_}tWK@VuhAMRC;S`Li{-@0H)Y8JQae85PamO`R^qOTTdJ zZdago+K7ouG+1rJ3ZYPL!YD!fXQZkMNDcNi_=VRXQh?7v63ItD*w6PDj_o&lR~s%U z>rpy5_^^*ovtQ98FZm>=SD04zXos(rr>c2V70(pQV7~G`66Ie1_Sl!2C6-^y z9Ci}diU&S#PWMp??d!Pi;#lSV$FOBr!V^Er# zuLpFvV1Lr+2G^Hs-kttx>EP=va?Amvbt3mPAD#eBDhEQy3!!0ksX8xA;*AR{3&UN5 z7oS@ZbEYiA-P}X8+aW$s`q=aMK8!;vb^7s=b1$0F)ZLPkqZ|6VPd4h`z3>x*yrXvY zJ>m}6s#n%0$pLT8zVlQ8tyAd~uyA|cU-2aS3s1jhC_BlS)M}_0H8`oK!`|ABQn8TU zQyaa{%hkJdqV<@qs%-5AUt#wq-mLBXGmd>Xzv@5J?3o%4>1%#c=Dl3S_t{UGd#pY2 zIzmhDku$G5jC^!&QA>QbE+=5|!|wY!2Co6>xEUI1;d+GkcEeRXl4|Y^R7TRlGt#);~@j>I@CgbR@ ze#^Yu;N?8!12wO_ohKjP^Cl3tNS2I3GEESyk}LngGf%3y_PChEks5d@eQZw{>*N`d zuJnVdIM2ZznsrB=^@Y0*F;SL$kOfO%7>TCq8V?$mub|Ot%U23JHoNYP{G4i3XSHTy z%3!I4@$+HHz4R&7dIT6M5Yqmg1u{LQnE4tRbz@+~yP|I(ZH_|Z#>*Upqj&M7ReY(1Ma$Ggg` z^G#!xPo>D5O47G1w~OeyRdQfOa&SP=bl<^gv9M3K73NqIGx@8gZkI-MQ=)^~=tS86 zVzZ0GS+7~D!OFf3MqH`yYNQD57~3UKqN&JVsZrquZ4S*ZOsCIIs?YB#yx(ixPS<)69QygygCo90 z$;}L#3mVsUTP!lYLU!MOR$||x$QP#X8cO?TUu>~fNLb(^@#w+Cj=jxJgZg#*dhQa% zKSb_JjJxdPTwvs=_=@1Xd$j_T>{y6XO);*H!P#xvAJEr&;X}*%(bNy?S@D-z z26U6ZBn-uQq}EqCB|jGP-&mXd`K!OW){~%~&{uIAa(l@8E7o4HV6~5`pfVLLjpF;K z&Zs|8KY{jk#XSB9?FGZSytiq1nG^TSDhou*%rpSpG!hw3WW% z?Mc$wiC*CVs0s3^=m$M1KQBmPm(<)1x8mcld2Fq8|i6FKd5To zD30^7w0xBxb4OUge8FzzZqnBZxn+5|CGuupDnFiFU3B1rnn+K{sfHGeM{!;(rcU{M zj=Ni!@;9u@%If!%#rY2$7S|2kTi3cH^Qk@StV?I)wUDI@N2`)eX+2<`Y1)=A?^J2k zuZ@%vZXeTPugTDOHGv6_%xel?JF)hr#cLaQ$kWt)T&oegw4&M4GFJZerNfl<_OB_1 zcjU}0=q!hno_oSw5j)cLe0Dw`&8+Fr^YB|LcR7)!p3;z3vc^RcW657h3a&W)b!IZ(6Q{i|$xSoC|M?*gMg8D}iHDP!)rHlGveFx7n}&R!%m{z4 zprKk^mylr3TP6Kh6{Pq}1(7}713ZWhfdO7ekC4BYP~64J*m*|tqXx|_>caYOY3cZF zT+yd+S9a&&n+{iV+819Q@6V6zWUb|KYKS7{R2iQ0&SNTDCX_X&%*ti;c)Z;17ht{Ul-Gl_)ji>qPPtv(^k(Oh zx3Ji}x4G5_-KFl>PvuQLQOQQ=m{y*RJ1i(Z#+crbR zFt*cA6iqAZWrmA3pTFJYvOv{hOUi_s{E`R$eJ@UAc6|#{U*cu&mb%VM&mqItl}#QP zj>&&2)8M#ho9u3{#TK*(VNKoT^4E+LwoM&2qEf>XObK+F&1T&L4si|LL7AqjbDKr7 zMTH_DIsNmu&4aJoO74>n)6!e+wm9()PBd!yWMKAEtA`?&Kcr6aUg=3FtdXfHOiQ-R zBIrlP4AEt^n?tQOxB12&=V3ahqWM)%dlZ?&_yF>$+|06B8~Cx3bpyZ%z`WVqG2D-@d=a zAq_46th^dG79`qX@(%xe`b$L1CafcK;TfrNEevC=3Y ze0-2@?OuA~vhat=BYgs2c~y6Xj)T!f@T=RHvagwTVW60zbt0s7m+$v6>KbupmuYo)4Mh+wwT3< zySAEXncwd}TKCw!Dz2>OwA9`!^m^F~mZz(ogubNm%f(ohH(Ji!$hO~&J08DQ!#xLI zecn6$ynn4h*S%ZTooZtjo8*|~5AL#Pl{0<@JfZJ}@8z7~P$}3twFI^O=h~MOXrD+r zv@?L@Pc}G23h?+|^^x|@c2xrXPdcp#({vVl(Rg1DzvZA#Ow58f(!=ueU*E0va~~S) z7fro|t7s2--TOqdys4#PMY#GxJ-y31#%Fh;Vx6|!*8$dO+! ztjaC_@ekIgZcR6b?=2a^+`poARJP;eymt?suHWZ>*2UrKj8mZDix(`9j2;*D^AKL& zf<35QVli9X+j^9ZKVAB9dsz3OCC)o4+)j5f=8dbQdX*o^JP14+fT27!8~vN8!F{+_Q%@7p|AoUahZh=iY5 z)EZ1WvT*&AGn*f;NjiRO=_;A3X#WF;vUV@&f?s3^71t(R#8$tKIGUOMe$|5XvqkxQ zgW}aAh8g?cg{TFmy)}IA65Ki8^+Rhg+}w^ziyB+&cKKo0l1N!hmx1%Ds_vy{yp%CU zalQR{7th5P?AcR}-_YX~__j!Le`v(mV_k#go)%`=&t{1xMTc!=ZGwQdiZmXhz(bB)%0lq&#{=X_XP7Wmb{Y>iX z2an+VEtb$&d~VJ9-IEtP9tn|2FTlC55Z&;B3(=b9woMzkTkkGtk@J3H zptlUQQd(xoN)k7Fja6k`r<(@t#wXDgr6-yX=!%@J6FRp-%V%w_qIdTD*PYVIYY*w` zT9E9oAG0^P@Ve?+U$;==y4`PgwL~gR>x8bI9{#$TYa>Hs4^DNEv_t%|C`Z~b-><9d z9qM$lVAaEd_n%j{$}iUiJObT`?t$(GJKPU?_*xx3O!|Ixd!Tx6rr~@M$knK0{p;#$ zxUHAY3`jQZVQf0VxlkFe?HGNfky_BSr&IwG__#52TKxJ({|5bv%rRBmD6hJ2?z5=9=rfmf-#d4U?I?dZwiO=(IS7qWd%>`_<D;5B_;2>=^4N9m7f$}HTCJER+%k!H)yJMmOC8q62jhJY7-rweq+Qx zzp?R3WK_}VKpT%x?#gmfc7<-JxruMF@mZ~udjpZ)sW-LHSIOjuE1Y*`NL#F0CU1Ev zAPLhE@aWL?_^k$vgl{YO>bTrW8XrSxvll~rL=kJ7- z@3A3O8P2a5)w|=8YkI%h1Zlv7JG{48@<`J6V{JYoegN?No48N9%H@N!@Xi=zdzNU|EJypP%(iM4V zM>tmJ_9KyPryj049BkaP$}PElK*^?f%g%+FJ>t>a_1mX)YC9#xJdgwt{?Maa`%t{>ob|*H5nq^`I~`hP`fR*o%HO zy1k_`LG$b8q_04JS6O4s-ep<~$>$8pZV)HBQY*VxmC$XyE|ZuQ#p!kruh%Bc*;SQZ z%Dvrda#=z=eT8H=^Yu@iRUWAApX*oaKi(}pvpq=T&XIzL(U)>ILmnT(gSXna($|N) zUH<`?`=?j8NGH*^VNXi<-#ySe$t{Ul$=BATsqgp0f>lzvYEw_XYN)H|%sV&Y|7pL) z&7;mnQ+stcrQJzif&F^(VW*wz)@MYy4 z34*)XEc#c4uuyQ%1&?^&zpo&BdUynq4SqiS{A=RfcB`W6&Bt?kPjV$idc0P9txs1e zG@fwrDQM5sJ$2CX+{GHhWw*9lKN@XbvdP*u2D7|s*B*tK_dV+en?HyxL^UW48t{7< zVcfTNys3#)5+ii7lsd=hp^g^WQAQ?$7?jDHWX5cdps!|h#(+OmXIH@;7-feIPdg1# zCMPuU(~~7^$_So1PUVicvcpCV*u07Uwn54WZysaz`*?p4o6Doljped=GbJPjZ?27T za&oqW5yHRBE}Q-QtwHdqp2V9LjPp`UGN{8`v+v8H4i{x`xpsn|uV;siR4egn&G^@R z%4S)lin;N&(8+K3Q0|0aYX1aM2W5OZXwa2c!r+cfvU$_q{D~Us*Hf;cqtlEEY95uc zkvc3t8eK3~J5J%192op&K;^PZNo?-tQpWUnX#sz%F*KRa&E<0oIs{ydp5q5O%}le) z1*vl*TW`D0O&@gS&)`S(1&c|gPFD}|>t}uVJnoWlJ6Fp1ry#*cH6F)_F~^&+tC+46 zEbwb-34256WXD8QxA*YJ`ud$nRBn5l0dHhhgWpwJ(1EWjqVi`lI>N>^F;m_BBy)bX6FV$e zVlZQ%-Hd9^|2XS37oRaVP%Sp|cGjk1mK&XWw!}4Tyep0}lIThe?xRq-41SwHK#Y#^ z*_oCCJpU`Vc5F0*+h;)GewiilhkK)C$0~dHya8D@bp>_iYczX5e{7(g5xQo^zda-D z#Td7AYDkFB8s)mMbvTGWysVs5*g=_MvZ=#^yw8ksepLZ~ zs6S}1f;ZYFtJ%&!rTL{{3DtUJAi9B9*@my+e&t$JP~)g4CwNxW;CehauX!xbwSu3< z5J(yy+U**~niPy%a z@FPa5bGg-;kr~v<=>p0$tCY&EGh^c?qA^2TukuG<^BZKV;$2v-`~!3NazaPXYze<> z+I&tXgui}_Yd0}V;t7tyjP=89OKQ(lyvsO%2aQIRy7B4t(YQ-{mQ=Pr> zve&s&ozwBME^||zp9BX%G#)Q&K092Qs;OE0+^Pq+#>!T7NlhJx79K~7i;6oN7aMmz z?n2zfxJz+KaaZE5#-+ri#a)lP5qC3=9+#8;KWLkqZg@c^o~kC&DWV`E=kLQt6R#8# zkg^yg=2$h+z5X^_=lSp3K9iLx%HUj%Mbk|$xY+aWL)(;p-}F=deLI@+o5qhilau65?>_@_(UztoCSjJp1>2?`ldyjZ0}Enu8oXxGegy`eGvPV^0;-Oy09R;C}>Zn}mV?30w&Ann}qi@S0Hp_^jR| zCfxHm8SvPu6pCe2gXcf)JmA|T$f?NeRr?>qu_%6mdd1ec_!Yx=;~M@8WxnpAx%j(+ zpqBqagRdJQ7#YDE*YRI0=Idq&Mg&1U|AjtZw^}eViZ^EQUzqZBKMFP&X zHFH@fsbn@AJ7tF9v0|v?k8JF;nG=t7jY{reV`t2gd92%1@;5ei)~uPwdO{@+vaxe! z7(T0xN*-lnxn@p$RtuFp$;R@`lKHG&DtVTT<(oD0S<_T9pN&QVAqXe<{t_affCxlH z0WpY%0um4%1*9M*3P?j76p)3`LO>3}2>}I&AOw^kq7cA9G$Eh@(S?8-#1sPR5Jw1T zLg;xw8^X;4x)5O=SOgL0fh7=a9#{s^=K(#4IS;IaIP-u3gcb%y5Kb7Zf(XK3HAEB! zW)MvntcB>pU_HbX1{)!cFu+4-G}sK`&|oV>Km!Yihz8pr8X8zZbTqJmm}meX4jR}& zXc4dr!ifL}h#&&?KtvJX1kpsmUWhIN_Crh&;0$rTmn2#gxI;Kma0nuZ0uP8N3XVWD zQQ!s9MS%~*6a{_|M--4Cv=}%B;luzLB8Y+G5K#;SK{PRN5~7QN5Qr%T!XSxyzz|LvG(iMu@D?IUgJy^(4O$?&G-!jE(x4sUNCP&6mH}N5 zP6m902r}RkM3ezN5KRX3LUbAM4PwfGeuyIj1|hU87>01NU=$+Af^mo_3nn3&ESQGq zvS1cs$^tILkp+ARy#NToxCKBMCM*CVFmVA8gJ}zZ1WaE5q+sR(APsXC09hC<2jpO! z98iD>azF_t$^i^alLIO+T@I+hOgW$qbL4;~jFt!5Fisxm!UTD+2qwydB`{4MEQ9It zKo4fhgOxBx9vHxA1z-f@6u>H&pa53GLUh3QIQ zKg?7D&M-#_xWZ^<;11)I!6BHS3_M_>GB^U$lz|saR|Y;XQyKWd9A!X)(HL+H#$f;% zCSbsEn1}&EFbxAv!gLG>fteT(26Hfg3ZoZ-Gcax;h=2(TK_pCE2%=%yLJ$Mf7lLyz zb0LU>ISWBNj8*{&Fir&|!UPp?878WLWSFJ`uEBH_kP0(ZKswA(0U0n_6=cFVRl#5Q z3929)CaQv5n5GJD!*o@U2QyVcKFm=C1u$9-Jb-a(pa>?Yfrl_r4V1t%HSh$ctASFO zsRqhnjv8RVXe_9Naad3d6R@BLCSpM?Ov8dYn2rVYFcS+{Fb4}7V6-}bVVpW>f(h#2 zElgAg%`iIn!e~t}4C6GxC``}<<1kSZOu{rxFb&f+!7R+w1YDS-3HUHt3kWshw199UK?{g9 z619L>BTWlPG}5(zR3lRhNH=n{fNUdL8^|@{w1Gk+K^rJF614%Qk){n)8tK|Vt&yn> z)Ehb4K(i681GF1)IzYFPpaT{)5_Q0mMw$*-)=1X@dW{ctoc|ZV)eRy~z3<1~j*bwXURPNtGX{&r7`Eqe0%5};U` zBhrO1foK9L1;i8(FZ_qQg1z3QeF<-3>5jOEI=7Xq^0#|iAYBL(h$fIyKuiJg!hg0a z5IrrT91%b`Ky-kV0b&J+6aFwxNH5mOR$7+7-OIvS&wgJ*V{DQm(uFXAXaXq(#1s%O z{D-?jjw8|A0s({rL35AUZ(G0I>qZ34a(TeB?;_ye$wwI6!oOl)?XhD;VG} zZZj80iMpdsOJH*qm-5ngZ0go^Nodd;IcZ^D@S;a)x=bg-i8C4-igY4`{3|iA^cu@_ z5I{IUbbyorVg-m3{xDA1uGd(ug8;$-q64H15Gz2O@P~22YCYpJ9Rv^#5FH?8fLHmYz|fam}z1H=jtC;VZYuuDmzV0*Adm7csy!cZ*D30J0rbRkS2nm|ec zF$Kg6|JklkSf*32hXBF>q64H15Gz2O@P~22OD+jxv2-U~xlXT=Rl)XC7L9sH7s3Rh z38WMdQ$W1%AMOfmdWGdW2p}9FIzY+*u>!;ie;6mM)e9)oK>*ckeZ+&%NOj5PI)G-qI@lz1ifW6vV1{Z_k2_3vE^YV>;A z&ax<2-&E6n<5# zDbi#wC)VUBFQ(8;sGR>avGVX5?k{JI_&}LI z-98)Pr56(s<8#w3s=dyCRodp_hkQ8A=`poAa`ISFs|+{iozX0GtYSoG>(?N`0W1hV{;dLr}j#QWRmypNOfW&zIrmtg{sI?k=@czw&GiD{ES_Y#Qt*E6IXhT^UOcti%P_( zkrGiLGHWPKznC-LV?TYj!tZ%&nt6FxS71L6+?In0NkKuG_*ajXo;z|VwB%KFP|^6i z>z_+XjaMe0e8$w1|jHc5D>gA4=?9izh_VDnKH+OWZz4>!v9f?)o#P3KRPsKTN*mvgQsfDSt7W+23 zgsxaWFjsz|d^;xHAn)#zy2GD}vRq3vY^h0aCqF;jz}MVqBPQP0;t+f@8->~pp;0?+ zgyt!t6j9>h;;2Wa0sAEythQl=P$)NH6iN#9`xAB(kb})+w)K; z)!*dp5lk2CYw$~M5GlatAc^FoAMEG*hx1T`c8u*3%wZ~mLdpJSo-jeLV4h#k@cTs! z)#AE@1S?-9jY28>CRs`_ogg{T)5Fi>7c~05gx^mfLc3>IDoCUY)~xuO34r*|6OcXK z13ZWhfdO7ekC6Xp1~2Cfhf2XpwFK#cRs8B@E%D0?fhT=E{xEf@lOA|naN;k5bh%$8 zqEMFeQ79tm(9QsoKiS|ADZt~8&g{3VZmXgoy;SgC@SF4*!9xCifMxDEf!K6IQMNb>um2^JgKyc-fEZxx(gI}!v_G>iUz9s32G?B7Z{8t8E}&~^7oe-Epub_dwO^Tk_~=7{6`2Pf)k=p^94;@pdh6u-=qHnY+U?Z literal 0 HcmV?d00001 diff --git a/src/test/resources/flowableExcelParserTestData2.xlsx b/src/test/resources/flowableExcelParserTestDataString.xlsx similarity index 100% rename from src/test/resources/flowableExcelParserTestData2.xlsx rename to src/test/resources/flowableExcelParserTestDataString.xlsx diff --git a/src/test/resources/flowableExcelParserTestDataStringOld.xlsx b/src/test/resources/flowableExcelParserTestDataStringOld.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..418038333dea300f158c29a2c563834927804656 GIT binary patch literal 7172 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 literal 0 HcmV?d00001