From f331bca470297059dbc522183846c87a33db5dba Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Thu, 4 Aug 2022 14:38:35 +0200 Subject: [PATCH] cellExists() and getCell() methods should support UTF-8 named cells --- CHANGELOG.md | 1 + src/PhpSpreadsheet/Worksheet/Worksheet.php | 2 +- .../Worksheet/WorksheetNamedRangesTest.php | 18 ++++++++++++++++++ tests/data/Worksheet/namedRangeTest.xlsx | Bin 9812 -> 10267 bytes 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 017e31ed..71b131c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Fixed - Fully flatten an array [Issue #2955](https://github.com/PHPOffice/PhpSpreadsheet/issues/2955) [PR #2956](https://github.com/PHPOffice/PhpSpreadsheet/pull/2956) +- cellExists() and getCell() methods should support UTF-8 named cells [Issue #2987](https://github.com/PHPOffice/PhpSpreadsheet/issues/2987) [PR #2988](https://github.com/PHPOffice/PhpSpreadsheet/pull/2988) ## 1.24.1 - 2022-07-18 diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index 45111f3c..e89043c8 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -1265,7 +1265,7 @@ class Worksheet implements IComparable } } elseif ( !preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $coordinate) && - preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/i', $coordinate) + preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/iu', $coordinate) ) { // Named range? $namedRange = $this->validateNamedRange($coordinate, true); diff --git a/tests/PhpSpreadsheetTests/Worksheet/WorksheetNamedRangesTest.php b/tests/PhpSpreadsheetTests/Worksheet/WorksheetNamedRangesTest.php index b367583b..506e753c 100644 --- a/tests/PhpSpreadsheetTests/Worksheet/WorksheetNamedRangesTest.php +++ b/tests/PhpSpreadsheetTests/Worksheet/WorksheetNamedRangesTest.php @@ -29,6 +29,15 @@ class WorksheetNamedRangesTest extends TestCase self::assertTrue($cellExists); } + public function testCellExistsUtf8(): void + { + $namedCell = 'Χαιρετισμός'; + + $worksheet = $this->spreadsheet->getActiveSheet(); + $cellExists = $worksheet->cellExists($namedCell); + self::assertTrue($cellExists); + } + public function testCellNotExists(): void { $namedCell = 'GOODBYE'; @@ -67,6 +76,15 @@ class WorksheetNamedRangesTest extends TestCase self::assertSame('Hello', $cell->getValue()); } + public function testGetCellUtf8(): void + { + $namedCell = 'Χαιρετισμός'; + + $worksheet = $this->spreadsheet->getActiveSheet(); + $cell = $worksheet->getCell($namedCell); + self::assertSame('नमस्ते', $cell->getValue()); + } + public function testGetCellNotExists(): void { $namedCell = 'GOODBYE'; diff --git a/tests/data/Worksheet/namedRangeTest.xlsx b/tests/data/Worksheet/namedRangeTest.xlsx index a4383bb0b1b6839889a3f7725ade8214db118e8c..b0936a5a1ee4deebb09dd33fe779f5d6e278e4e1 100644 GIT binary patch delta 3842 zcmb7{WmME#+s20+ItS@y2pKvgB$SSk5|Bnh7{UPs0RjI4I?^?ibb~WAN{k57;80Sc z9;6lNkgf;M2hTd|eV-4{{^HtfYe(v0X!);A?$+ zp+u1iJWUs%PxZC7-Cs%=OPcR9?e?KxsDSA@v_ex)?{Do{o?L^z!wKU>$srJPhg&Q* zO&Dt}@_yepmg2euLc7V|Guo5wF%#ho9G2v~u;JTwV_tH-2;OUKwz!!12dYN=3@Ii# z=x{lG;eJV?L-S;DjD-!?dZBplFO0pg$x8|KZY?0QWX(c2wdDE(TJf0V`53Cd?D-6= zO%K0pX|Pc}_9TyQFkC`t;xXCvD#n%a`HiPKnb9L?I#{D~O_rcp$)eJdqHR&(zFT44 zC)}EjtL}-DH(5EfY5wMxs#(^Xo>F|oSx{!u7z)Q=4~zF5l1c41MTuVN5#jfB*yyNh z;RTH3-QR7k$VQk=*ZJ95fIXEGUO~``RWkAP?BD^ zJ=!bDX2hKp6Qc|mcbs!f37?ak5<1-NN{W%dNZpINJys!cvf*Wj=hp4Qd_L?vv@v0; z_pMV1g1u%X8pc}1vgYR8=#E~=@-}8heggUd9*Ous&D&&pL~nzhaB-;{O{e8MYeNH7 z$!K`>gbvwENxLE~nLTG%Id17dG=OSOn&OF6|q%XIo^9D zg2gwlp}3&EvScnuOzeY}cbs}{F$oYAv>w(UH}Rn+p}ze7v5Z6)nH!-#(OsXN?Pd1b z$r(Qs=i;MNn#WkxX}NKWj!hQi!2~tC1Z#*IdFRje?cku1!_(3Q|6i6!xR0;i$U@GQ zfmLQbl6UjaPl3hll{FFe<_|7T&bSW%l~ccqADz{b7Y{BDI+3($$j6SVW3>P)Nu=^K zx$vQGA^Oi;qrbR@uUgf0Mn|z`YEz`#ER|pLP+^SjtAUJ#Wj-*}undtI(ZI5k7PxI^ z&LjN~E&>~)zAZHX%nBcf&E!iIaN%mKjM4`_ByjaaW0ICEM-}|GED=v8zpSa@_!wlk z9^Or%jhfI3!6mT;t2-#sNpWr+?DXFEmd|%gPW9USga{H& zR`%P-bDtitel`j8!xiNNA+jo8O!g(SbMxXJF>!GPwfh7d&ACXQK4E+EDbv`2${p>a zN|A{XgOgr>(CW01`cevgLUPjc`*vl7AkYNbj+PCO`t2>*$?$|MNjlVK>M=KLrd|Cn z=nY;hyrDc8+rS;rOVv)%@M=Be)e5kwp0cLjtSK5M%d&f2<}gQ%%U@@IwxzDL7?EvE zsQtzIC0q|Ut0)wKs*;(-46zCSB)=YN8*(nIcBgSqOr1wpvbEToEVMl%UCe#X`D;Y` zH6YI4nmELd{d+LDkV|cp6Q8^ohA5y?VWbG4?Uav8-ttp5~-GkP#wFK^VTTf}Cd_w>}lXKT}g zq3amz$3v9QU*Zz^Ig3`g5`7m#^aF!xI4#x7W(H>Op8JhQueApu z;Cf>U1;nv6ak5#-=jY}+2`Pu~;hm{+#-ogZ$FC2MU7yt4UsZmpZhXnD-EVH0Io&sY zbDKJ;G)VLf2T7MJe%n*R(x2K-bvbO_W6gtK6jPHemnqIje=KCZ8h80qTzZM-?4~P zwR`?4VrWE)r4@t9@XCvF>j~^*MFTAEd_O__dt4VM7mknSOS1S_VWx3IM#Ao{PDeWs z*)JLI>Dk!XL0PJ2yp^v`6>&qset(NIWe$-hD zxyqsP5wWu)9GM!rnU(!E~S zq>G1%k2;k`rBo-PrUUzB5XCUGw!VyrRqG<<{{rg&%juQ>4r=`feINyS$T<(tcKLEY zp-nj00nKXG-6;Rgb$``+H!1V_YW!osoiLAY z3^vPJD7VVyb*UixB?81P)t!u%0fh}YTK?nsU?ojG6J+Lh6CrN0+gU;klgPFm2!N1e6VC`q$nzQS32kx!ys+f;4KcqWBT=gFQ&Tp&_ibMFB)Zg}9mIT5!uN1J z9B!UbIY{>N$6#kEW5w80dD-Y8PZ{E16RH~3-Ga9H@0F?qs@X_bl_IpTr|05KnNdCO z>k+anmf_Ub^{fQ_P&7jbR4o&@yg9B#Bgpqt29T+IAsbxLtgxdpn~|tk)$ZHR*~=+8 z&QEWbXd0_~hQM&~kf10$jE9`qOima49X(FmG^!1={eKR9+4PH2b~TWSEIM()f1GOY z9v2Ly%FCNSSRXTJ^SFcAupl(f)o*`Bu)&5#HY<{PJ|RZW>oqIi?XLWK?769*xcYF@ zPKF0fnQp-OaOa z!^6K^&<54S&d)6h)HsM+!O^Rl<>t!{J;-?bqg<_02EjMsBQxQ9Muk6ym;YKOq@t+F zjWCw~CDY|}GjfR)SRA0SwQe@Vz=uYf?`ipEQqYuTRzEb>jgN3Nbd1Pn(2b9#89~wu zLC+=J3xfuS?YqBr(8s%1B=z4}q$5dL<2=R*7tc~n|N0o*9@n6xg>0DP5&0?f%K05} zt2|+&oc2tK!H|HVU8k_?C?WI&qyn~xQFQB=icC`w2`iEZa+&gSviWCDx?tn78f`Ax zlF#Gs+f6FPiBZM~9+wZk83c`(&QpAGbl&$oX<*Ung@?)H!n|t5@6bdwI(m>?j5_%> zX${uqOzb@=zX>xAKT8~X*-lg#dr~MnZmnmXhPMvC>kxh`R&e6hsZNf#e?!LLd?T|P zcvFsFjpWD)Ab2FUJ-f7`vsaJ%8v5#fz|3DqZ;s!bw7w1cr8$UIhMs4JVs^t{RT}tB zDi>6(yV9?kp?um*Xe0byN)bibblhLSfm8zUE-uv4gDZ`O8=hQ3D`#yUYJe;UZFqW^ z&ANST^4Yb7Cw~Vf5y;qpfKUts0g-~pE**mxgx2SOO!3c9h#umH6Dm@oIR#)Gf4*=e zAP~!?_@5O)jXtMhLjwYI9DkDX|A-vv&{zRYLUBg)wtyOSCEMS#=0m?AFV~0Yb^!>- zAJ@993;Cz^<*t+y?G05YOy@#ZL-{!Vn89Tp)Bj6n&5d4%@^kz{GzdiZFTpe~8Yaj` JN&x+R`X4`Q0$Tt8 delta 3355 zcmZXXXEYpY6UUdR%j!LPP4q5SCqx%*$?83_dc?{q8*Q~!S0@o&wCjr1$wi0~ArW=e zi|ApoLX^Dn<=%78JD;92=YQtIoZo+Dp2CM;jT;xqkYk_|$D&&RfDZ)#Knnl>LVcv* z{y{KTe}9-{sIN~Q#KFH1%+{mv<(&58$iN&a=`nM3fidNT#FrLE>>`5EJE)gZo%AEx z+rs+dU{fJh&{w$rB7p(@=hfMBCyjBVPs={Z_MKIwo?V;*;hy{{Ih1CP+PTZjW>`DY znxUCUSs`VqZ8o(Dj_&-+tC@3Da;M#=19`xmU73;cI^zCn44S1}eT`Yd#eG0mOE7p~ zzFJJn0P2-B!mlJgd4i5^WOzmq6-r6wRBx*-@JgOk!h@Xuv8mw1A99c>HE2c`NdxcS z4R20jS(!B#nu>O2 zQ&LY1E@$PXBQvA-y=fd#>uk|Wa?emGp_OM3A)ew^S>0|DT|h#2QsR>2~9S=<|Kt+b4?;LGr> zTXUxZv(y|p+>ccYI@22Fy>cV>3W2s$@5a%7J28<~Hn^om*^NS(rU$}b$K#Pb$q~2L z+q}vBZAInictakPUC*hEOtVW5ws`b|4-;J#_0k$P-87o)7pd3u;VAR+@k+;XI~tlQ z^$?v=I8<+tzTy-e1;st_*i99)j*!U;o@z1BE1>ww?fS}lpv%q&EZVdZ6G73HN~tWV>}_AHe2XoWse2{z_HmDiC;}TTbUm9(u7|EQ0MZ8o=CO1px)NHs*Aq@ZMi)ureowa~@0v zHxp(^h~}*|l`1hM7fD%#BryPBi75c_BC~L*h0=7W12F=Z_%it|K0d8jYZ~3fWJ7DS zAE`2l%;=1LPKfn#x0{7+!Jclj1;2~uw_^V@@-J1%brXp&0juu6qBh;$!zzL12P|is zY2otyL$*-XW(x(U6;{7P%Tv4#0`k-Ow8)MGh<&uujWy9ua0!!qgSYC3C1e>Qjh?Jl z!{5snOqNPyGE+t%4F#DMdPD_((u1sXqVXxN4~Ai3%%8hTS~! zm(aueFUWlm^F!$mtqZN7u=N*el-7mT&j26GayBLF>;gH zD@P{{Akg~Cu7XAq&+d2LkhL)NZ66UiRlOpl201MRBfq(}w(>GOUnN1dy~G>fn^sZ1 zgHf5RCWurJR^A8;76_o7FFTBb_D8OoEba4~?|?f7m;$<`j;|#KcBQ8^kS`3QO>T?i|O6a<8ng}2U7O;>@UhP_b-%Yidz=h*RYMGCDYC%BeI?+@ukI7 zdgD6XBonRw`WTW4nY_Mez-!~IFr|ixt~@K9o8Rm)i|Q>PnH}d=Qen~XX%q7(kCrvXM8GmubfW-IlLuu%8PcmDm43_@i~P^O~S-#Hgr43 zZefQ@uA9seM2iI__Xm7}N~-KozUe`g>_CCGVu6oK-g1|gtg>7ccJGblPba|wBxY#i zBl)dx0BszV_0pS_5SnL4>s)1#x5^FUk&Gu2Ti`71&Lo1|7Pp0Dq|>+5=1Wjsp#gwz+$?& zZX@MWw19ombheY(!T=q2An--at-HU#XS z9#rhtIed#rTX=eQZxa9lo>*|)%?vTlBi`>)qIMGrdEI6dtwSC-X^R|)xHm7MXuo&P5@0yQ z1zBldf3-%#R+y1ss()9n{Ji-YZ91_I2-pnI6K48_P_x~*?wSx|tg5;E9BW$DX4%3N zbFYK8fg{BiC+s`@f#Upbq?20riS?Qxyp!R@h&@nPJYab?XkcF*dZ;$bX*ReBgnhph z^$D|#vgaHx%GG@0e9BBFJ#;75RVR*TLn18HUdlW_Giy*VW!uNZQ{0GsOugg7_;)y8 zd=yysj7LTYO&1a-$9D}F;dBZ|AKm_q01!z_71(pr)9qVt34AwA?e)V+Q+LzOYJ_$u z1Pm{qdq7?X3 z#h2ycL{$-f3n8DrH%W;U+eVk$H`KwUy~s5~?k>M$tX+XoxC1cys{x-3OA&+0I}D<6 z7>dpWCUvW%zh!)o?NY$9)sbBX($q8W0>^+^#x~9)41(8PZLO~4m(W~@Un;H||H$7z0I^2wHBbq8` zu@HXE1RCR*Sl5aE25;Uk5_-p^E#~!!gBcyf!yy{Mqd=c76+vwfra!1(;0Vg+W} z?n~`LGmG&D7HZGnhZ=YuIN27W+uqa3|Btk#UA@TUqkfJ6ukGxEMax0_HOJ%CT4=it z32Lh_kTz7=#_QUUUbTLBw0t&8RFhi?W?RO`=l3^?1eYm3avF71RWPI3`Sr)uc=lwn z0U~EGf@^~Wd0loykGT*`2mbqMz+?-V5a$6g>q6q3{~REs007&K)BlaXsWHVM4vd~K z9p^uL=Kn-`v^OGVOuVoZaUVUVO<03iiyd<=%)|N5N8y{y(}=E=;qC0O!9D0swUX5$N$^jz##%zyiOs{{uccAZ!2t