From 1891c0b053d43597aaa4c1d7152e5c7f0b52ce91 Mon Sep 17 00:00:00 2001 From: Adrien Loison Date: Thu, 16 Jun 2016 10:06:11 -0700 Subject: [PATCH] Fix XLSX reading when shared strings is missing the uniqueCount attribute (#255) Use "count" attribute as a fallback --- .../Reader/XLSX/Helper/SharedStringsHelper.php | 10 +++++++++- tests/Spout/Reader/XLSX/ReaderTest.php | 14 ++++++++++++++ ...with_shared_strings_missing_unique_count.xlsx | Bin 0 -> 3616 bytes 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/resources/xlsx/one_sheet_with_shared_strings_missing_unique_count.xlsx diff --git a/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php b/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php index 750c53e..350024a 100644 --- a/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php +++ b/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php @@ -159,7 +159,15 @@ class SharedStringsHelper $xmlReader->read(); } - return intval($xmlReader->getAttribute('uniqueCount')); + $uniqueCount = $xmlReader->getAttribute('uniqueCount'); + + // some software do not add the "uniqueCount" attribute but only use the "count" one + // @see https://github.com/box/spout/issues/254 + if ($uniqueCount === null) { + $uniqueCount = $xmlReader->getAttribute('count'); + } + + return intval($uniqueCount); } /** diff --git a/tests/Spout/Reader/XLSX/ReaderTest.php b/tests/Spout/Reader/XLSX/ReaderTest.php index 2703799..c705f2f 100644 --- a/tests/Spout/Reader/XLSX/ReaderTest.php +++ b/tests/Spout/Reader/XLSX/ReaderTest.php @@ -112,6 +112,20 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedRows, $allRows); } + /** + * @return void + */ + public function testReadShouldSupportSheetWithSharedStringsMissingUniqueCountAttribute() + { + $allRows = $this->getAllRowsForFile('one_sheet_with_shared_strings_missing_unique_count.xlsx'); + + $expectedRows = [ + ['s1--A1', 's1--B1'], + ['s1--A2', 's1--B2'], + ]; + $this->assertEquals($expectedRows, $allRows); + } + /** * @return void */ diff --git a/tests/resources/xlsx/one_sheet_with_shared_strings_missing_unique_count.xlsx b/tests/resources/xlsx/one_sheet_with_shared_strings_missing_unique_count.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8001e4ba670bf93f66c142a81b83c0606f3d7fa6 GIT binary patch literal 3616 zcmai12{_by7anBB){s3}VzQQfY*E$_!^o1QD9eP28N0ED&{g(axmn7Rijt+MaHWy5 zM|MJGUvjOJ!S(%z7}58Azvr3fnP>jz{hj}L&pGcoW28@YfE5G+(SQt6&Ch_H=11TZ zAW+l+5Qqi%^@1iA>TGD5 zV^rM~SEtaIO2snlto~;$t>-8_FPFyP#>VQ4_~ZrGt}92>iU-W>tPomY!vOowdCbU$ z@-?eQ$1%qd4~`HSULVsap;|YX-~{;OnFz+AA7^KZOcKgoCaO=ounMh6LlopJON8C> zL-2(4$^2ap$<30B7iX;v=uj6NmetTN*7Z&J99+ZvidihY6U}C6f=OGcZ6s7AO*=j+ z3YEaAeHg^``NRb-ybPWTwssr7G)Id#sCKMJ@{@xU^!rpVTFR!%hg($SsK}=~bLD}{ zjHOC}kt}+PS6fA=z?Me+FVr6TjO*W+I}&l37dFqY_^P(+dzI@;ROsn=htXD{!jT+` z+mM0-(d@OHPH|E;U)*GjiNYAsRn>-R9;2TmgFp_5kGcS_I|mGWyX1j#@s!-Q*-C`3 zCSTDQ@XU@91ft)uksw(*};neGI)$ zfC^0BG^O^`pKo3`9S%?JK~5$pmUCJu=An&P5zi$S#rwY(oPSto$;S&lQTEXuE^O>WV&iz~Kz7_~bPuisBW_-H6cRRA8D< zYm}41?%rQEG^kc|{`McoTH+GT>v}S}V}cMLGNHcPo0aF_@M%>OasLT1;M)PbxT2F3IKpex9wNOVmekp0S3QoS1~3Zn@#|)2ed2K);(KhzF3c|c3A9HQbK-qZxb3X#Sk(ZQF*;J$h}ze zupmYf^>M26RET?$BD^SOcztmuUz(_(-KXg-oj8r;(_Z=-z}+s)OpxY$bd#AC%#nK9 z3p~&z8P`&nqKcR_=XOa}o?fldS24z3xgCj8 z>hP)uWr{_~7F)@IojNK;WJj#m?7P-~}ZwknI04)g}tYCtU-x3;N zzR6g3qu+d-5jX2?^>=~!XOoHJZIP$!PET^{slN3vg*>pj_p~Muvdty-Q!B!8tufPz2gYZ5 zucq6w|5;YUE|jqJM2^4$Zb4m4knyWwtr$+xZn~ap_AWk*Sw{e ze^4)@q6~|j${I&!zdM|ss_N5o*}9}?71d+W&p{4|G!`xN^2U^aU`BxS9{d@Qm!Au2 zGZJrO11$b1LnX5Jnp(ekF>kK3p4Aew^O$#A0bH7vnezaqW4bF2K4D($F~1-i%=j%Z z=y@d1QLUN6p=YVCSSC zU|wP5x9bS|)BTIeWxFK$^TuJBhgu==-qVtnuw=_+p(pJhOjMH%3%HFP{_KMZN{%f? zysmzDaSa7=Hb&LHOVV_O=utE7Ghk_l|9~?J&Q*@v#a%^*nG?d9v zcJ>uBfn2a$Tf;NY2oNUohqy6~^nb^$wT7nEa~Z({+&&s8w65<&jK68*J7R``D$USa7xJV?t;#?vw zv39LrT;FNMt%=8YB?V>m<5?YA91m7YT%o|W_2RM)zU z`|=0HrbmaBi*JNtYhptZ)MwE;6ajp`gKupZRqy3CZM>s^*oT0DpJGuDdp zGJ>E{L)uQmstml5?cX9-SCC}{dvNfibpsO~<SwW=SuB-j>10~1o>4ZXg?H+CRKvTtzy82B4HjF?Ga_+O; zgh-PbD<+|pBrsa+xv%J=cvvYV)gO_;omP~_+@TQjaN1Uo=_LXJ&5mVg_+(Dv=vc)fT> zze;<;pE`?3m1PxvUV%UP-}ik?T#~-obA;nlfK*ceWc>H-6<}%C`OPj%zF>boNShh? zpn$5}7XDwI?%mYLn5Z4hrt<$UXQY*eeEtHW+O^>P>TmCgLx#QC4g0z9kezOI+1{;z zjLrw<-;UGm9fAzsPY`KdlFvWDKZecex&5~L0lx-$h}pN5cIF(^xrF literal 0 HcmV?d00001