From d0076343c47aae40606ce30c7130ab8a0fa0f6ee Mon Sep 17 00:00:00 2001 From: Alayn Gortazar Date: Mon, 16 Aug 2021 14:05:32 +0200 Subject: [PATCH] Fix Reading XLSX files without styles.xml throws an exception. (#2247) * Fix Reading XLSX files without styles.xml throws an exception. * Bugfix, debugging code removed * Fix Reading XLSX files without styles.xml throws an exception (rethinked) * Fix Reading XLSX files without styles.xml throws an exception (rethinked) * Style fixes * Fix Spreadsheet loaded without styles cannot be written * Replaced test files for empty styles.xml testing --- CHANGELOG.md | 1 + src/PhpSpreadsheet/Reader/Xlsx.php | 26 +++++++--- .../Reader/Xlsx/XlsxTest.php | 45 +++++++++++++++++- tests/data/Reader/XLSX/issue.2246a.xlsx | Bin 0 -> 15138 bytes tests/data/Reader/XLSX/issue.2246b.xlsx | Bin 0 -> 18924 bytes 5 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 tests/data/Reader/XLSX/issue.2246a.xlsx create mode 100644 tests/data/Reader/XLSX/issue.2246b.xlsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 29d794ba..32f3e5bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - Xls Reader changing grey background to black in Excel template [Issue #2147](Changing grey background to black in Excel template) [PR #2156](https://github.com/PHPOffice/PhpSpreadsheet/pull/2156) - Column width and Row height styles in the Html Reader when the value includes a unit of measure. [Issue #2145](https://github.com/PHPOffice/PhpSpreadsheet/issues/2145). - Data Validation flags not set correctly when reading XLSX files. [Issue #2224](https://github.com/PHPOffice/PhpSpreadsheet/issues/2224) [PR #2225](https://github.com/PHPOffice/PhpSpreadsheet/pull/2225) +- Reading XLSX files without styles.xml throws an exception. [Issue #2246](https://github.com/PHPOffice/PhpSpreadsheet/issues/2246) ## 1.18.0 - 2021-05-31 diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 5d379daf..2bff7e1e 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -395,10 +395,9 @@ class Xlsx extends BaseReader // Initialisations $excel = new Spreadsheet(); $excel->removeSheetByIndex(0); - if (!$this->readDataOnly) { - $excel->removeCellStyleXfByIndex(0); // remove the default style - $excel->removeCellXfByIndex(0); // remove the default style - } + $addingFirstCellStyleXf = true; + $addingFirstCellXf = true; + $unparsedLoadedData = []; $this->zip = $zip = new ZipArchive(); @@ -534,8 +533,14 @@ class Xlsx extends BaseReader . "$xmlNamespaceBase/styles" . "']"; $xpath = self::getArrayItem(self::xpathNoFalse($relsWorkbook, $relType)); - // I think Nonamespace is okay because I'm using xpath. - $xmlStyles = $this->loadZipNonamespace("$dir/$xpath[Target]", $mainNS); + + if ($xpath === null) { + $xmlStyles = self::testSimpleXml(null); + } else { + // I think Nonamespace is okay because I'm using xpath. + $xmlStyles = $this->loadZipNonamespace("$dir/$xpath[Target]", $mainNS); + } + $xmlStyles->registerXPathNamespace('smm', Namespaces::MAIN); $fills = self::xpathNoFalse($xmlStyles, 'smm:fills/smm:fill'); $fonts = self::xpathNoFalse($xmlStyles, 'smm:fonts/smm:font'); @@ -593,6 +598,10 @@ class Xlsx extends BaseReader // add style to cellXf collection $objStyle = new Style(); self::readStyle($objStyle, $style); + if ($addingFirstCellXf) { + $excel->removeCellXfByIndex(0); // remove the default style + $addingFirstCellXf = false; + } $excel->addCellXf($objStyle); } @@ -624,10 +633,13 @@ class Xlsx extends BaseReader // add style to cellStyleXf collection $objStyle = new Style(); self::readStyle($objStyle, $cellStyle); + if ($addingFirstCellStyleXf) { + $excel->removeCellStyleXfByIndex(0); // remove the default style + $addingFirstCellStyleXf = false; + } $excel->addCellStyleXf($objStyle); } } - $styleReader = new Styles($xmlStyles); $styleReader->setStyleBaseData(self::$theme, $styles, $cellStyles); $dxfs = $styleReader->dxfs($this->readDataOnly); diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php index a3776eb4..e1271b9a 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php @@ -4,7 +4,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Cell\DataValidation; -use PhpOffice\PhpSpreadsheet\Document\Properties; +use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Shared\File; use PhpOffice\PhpSpreadsheet\Style\Conditional; @@ -63,6 +63,49 @@ class XlsxTest extends TestCase } } + /** + * Test load Xlsx file without styles.xml. + */ + public function testLoadXlsxWithoutStyles(): void + { + $filename = 'tests/data/Reader/XLSX/issue.2246a.xlsx'; + $reader = new Xlsx(); + $spreadsheet = $reader->load($filename); + + $tempFilename = File::temporaryFilename(); + $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); + $writer->save($tempFilename); + + $reader = new Xlsx(); + $reloadedSpreadsheet = $reader->load($tempFilename); + unlink($tempFilename); + + $reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet(); + + self::assertEquals('TipoDato', $reloadedWorksheet->getCell('A1')->getValue()); + } + + /** + * Test load Xlsx file with empty styles.xml. + */ + public function testLoadXlsxWithEmptyStyles(): void + { + $filename = 'tests/data/Reader/XLSX/issue.2246b.xlsx'; + $reader = new Xlsx(); + $spreadsheet = $reader->load($filename); + + $tempFilename = File::temporaryFilename(); + $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); + $writer->save($tempFilename); + + $reader = new Xlsx(); + $reloadedSpreadsheet = $reader->load($tempFilename); + unlink($tempFilename); + + $reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet(); + self::assertEquals('TipoDato', $reloadedWorksheet->getCell('A1')->getValue()); + } + public function testLoadXlsxAutofilter(): void { $filename = 'tests/data/Reader/XLSX/autofilterTest.xlsx'; diff --git a/tests/data/Reader/XLSX/issue.2246a.xlsx b/tests/data/Reader/XLSX/issue.2246a.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b16122089320ae67bc486fcb47d340f47e3de1d1 GIT binary patch literal 15138 zcma)j1zcRsk}pnh2u=tPg1bYof#B{ixVyUqC%6V3++|2`hv4q+5P}DHw>Nxucklh~ z?tA-Y>YUT3Pj_|KzpJbJSHEgS8CWlAp#e{WJdlY}OjKl&U0-Qk+VsWe@i8YmazpLQCXDxscKvy= zDod6X53kFhf!PP>I-XD_iD()K9wsCgU z@^E8M(tdy2{}ih5a=aUhak9qmbH5y_ugCv<=J2vp%>1(Wu%>Sl8{@|OtNre(`(hlv z{c-v!y_h@uWoLa;f1E_H?&aM6m+y1?%L>2W_2v29W{ThWZiB?y&)dh8@t23|mysJ8 zvrUkOjM)L`DV~tn8OWAz>((dafP8Wd0VHtfj94dXe*a^DWUKQ9CpwixHA_0>wDr z2;v!$B__fS?dzfBSU_t=G~xbZXdx>~*)ls0wOGi9Xp(Xa6SumbB4WHT0c!jzelUJD z0pj7H%FE=&isQzbhzQ>t>8WCMw2_6|x(S!DsBI?c>l0NymoO80ox}5 za6xM5rp_B1Z!AFAP@$~CRHtvFPbh1!I;N%aa8k)fLn>EGbP15zZ_I$gq<@JD{Rj1c zSskrpMfqOyAqAOo|EuMe)bN(R9$n*&w@aSb(4N@t(cvXqa&Z4iE1XovMA(yK>5bO1 zI-mO??4JKXdXx!WMw}UIPDR4~N=&)Nepzn@vZ*2Iym){D+}1cY^xXxdEdN;}D})@8 zGH)+>Hv1qXT6;kSb4~@L#d>C9wjpKwN^g13Uh}dbh{XSe2n3Wk?y~|`2tlfPVJi^5 z5~LSz2GZYH^!7}rh8IV_lFXl(*F2Anva-mH{YThDr7Q8NLFc;x7 zhAP2449Og(3Z%5iJ0fD8-aiH?-=wKK#?;pKmTNM+7OO6PvTO*1mkVd4RF>PF94i`f zlZ2P+msc?mtm3mN{TkXE59y7KI}^y(>jUU1$ZhbIgJx`P?ZI_gZ(xyeG3}R-cWjLU zK}A36A8X3e#+QMcOX$6r$I!~~nrv5>kR!PoE-bEyeZ^gd>a z1_r|dsvLe(uPIFuJ!vbbub4rQr#YIhzUZ^)ZybE&E9Hcb{G$4CZ? z0IW3|t^CV#RD1M-!HOTXu(S> z+t~W?jwf=dm59;-k?AsXszL4a&MIOu49W6}i__|S_#@?KD4mCadQM1zg=zy7j7Ls- zHNeWtf|^8uqwGa(qdmB!S@mP0Un8)^a!EYjkkjIkcZ++v?ktn|q^cZzkw-$qcLRej zRE*XiYmsvxxG%DeD5)Xz8cC^KqdL#LMR9kOu1aFH;={sq0&%s_pIuXBzg z6H#fIE{q(PV>^iH8H8bTP%{i$l|y@h<~Nd(B{+aTB5@aZ$C3@4sFlt$vAyMgP08dH zn0s&qVG!RLx2bAN<<&<@1UH)pH-`o{Q&L%;E47-wC9(?!OoH1m^3aQVJZwtRS1E{FbjwBCz6%&8=5M6{C|} z>Q(Hh_thl{gO?G$>mE%t@EyV*QGiH6``Y)2+=9aF^Kf{%76NInds$I_tCAPT2e~o4uxz_o&{Q%%ZVsBTX0)y;bhj)S32O#MDyF}7o!zp_=yD7b* z_&S~{f>kWr*xKpmyLZ#|L)nne5ZJzbyQMi1Vz3y>GPH+WL)3Uh-bRK)73b8-!YXsf zD!xeo$3jZEMRwUc83rA;BqM8)XMVpW^*d~^0d0xH=3sJ_EW!ErN2!S552OIb6%TSC z&ki<9|0A6rL_X7D79q7e>_|$PyNB*n+N>Mo>g zYFfPO!V!C#aCD}US!B;heT!mV)T7Sve&=plaa*CFOUAYt zF&6=W>3Jj(=uv|fdB?8O`It(}>X+RaZ17iRuUry9O2*Gjn&Ib8(QtM_F@PO+Bs&$k z-pP!2fydIc2@Sq_3q{YeA-D_EyRrb#54B z7$IUpQvSilZ8+MVT_&J@1rc1pH{|5_^Zv&GtnhZfSYRc@CO>@%ynDETySO<)+BsSK zh{pht&vNf%4SPg;saHXHWUZYV)IN%{;7}V6KZN>>tPY)6dkKvLG5sx25S3)rXKBfB z4`jqwWz3{j6iE_#l?A!qn?GRl`}+{OfOsR{G3p&sZUFws_?^y#i06rT=K_fBg+>!brYa1E*lj9-K7_H0ItHFrT zSwtlJD*iO9%CSrlg5WI;`5s7Ke;v5(3B#$1gagi@Epf5(ids8Z^I%g&O2oO~mO$EB z^B@QLZH5~>M^pc`2nk6Iv+Qah;c%-?;Rrm*VKxK?tEd>!W6iL{=7i7%LaYoW?sXCM zZL44)QR$lq)n?+}EW-(EJOm#j!-)!V2v{ohs6oEC!j2-Z`i*+821nVePBQau2Wv)A z3?gQsjMb^-mR=>K6|6)Y6lciv*~R|HLjwy3qW;<;pV}jG8b2iz9un?&8$I87cS6*2 z7i$Ixsou4G*zyK>;kSJbPt+@C1~)2D`v=H)ia^FQ1Tvl;4L-QSQZm`QH9(JcAADgc z1wRoE)^_$JBYNj&9)+Afx&X)wqTI%~>j;V4ja7r8?0w8oVAz5fmrvO!M0!qruj7f7 z_{au;u&At+$tft#zJR}QZZn`4-s6ddFn9$)Y~c6Wk4pTJ-8*AQbFA6BC_5M4Mjyss zb6#Xh}J z(YiC28XROWhmzM5AgNxoB#!Of{4RIfuwdq8OzqT*{$BIs<`V{2QmuWGK!`%1KC`G3 z;*^}8J6Z1adv`v9m_ei$O;DXv$2BrGkQ_XeWH&5`wKf*4WZ99as=Kqy5{iD+7fFb| zcZk1ag>(Zc6>~P)5(Rt|=|C9L@E5|gDP%y1Qcg`F7Bb*59KEI4+Y3^*3v@9XvZ8lS zi-Bn5kGC|6`Ry;iaVt-u#c1&mN?z4kSjE7%I|JoaCk1J6N7{oGSYFyBJG*ieAn6LN z7H;Jc{n)p!*I#Qe1j`^8Trsf`%yNiHxIH`s216#GK6g@kP10F((h);jPn-KeC1=p#CWlrv`8& z%hJL$4qx--4~miCV>3mvtSM(pfkt4kXSQ4rcyy`tTUMv4(fV%%o1^L({s^M)G{~wP zNxhHXee|4qX=))3X za-I*k-U;J{Lm|J2E*d6DmU8FBc^PHL{23gPUjXv^smk(#PTTp&R{(c`e;*F7QkZu2 z906P?mR7O1s&lj7D!yxw#JVWqzO5i;W`&5xbY^|y`yDN#boEnW7oi`a z*U0cZCF@xbr}L4Y5|mxs2)CZFu0}=4_{7m`v|h8WOGPR0w89L^E`rleeJD1xvrLkL z7%jI{oXW}Kqfqcr0gwT*DfKUUMkpPxD@a|N#G6_+>$dis!4g6~JvSE?a$TLnI9|C3ri(2F%D>ge$ z6^jTK3cKo+&T9efdv5U>$hP7OleAZereAn)80k#yb}bKJZ6oRAg14j5aDURipFm2)$|Kzrwdp>CK_`x zXvc6yHCQQ!>c!xZ-bk=%4F!+Ctc!*gkDv0NBue?J4(JcF`AV}xt>2Q@OE4I`$3!cW z4vJbl@#?-;(8zaw64HMq#eEo>N^O3OB zz%W!xOi6hJLpktHSegYOiL`@A+j+R;!w8C%g}?YltD((Ohmya*E?U$xMUpf-hyK*P zGD8Z`+hK#h5J?^Znt5GqmAev zzMp^i+WyrA`M>(z>b|wgce7yn>-RQi>L^Rc=QZmBfin6Xj$@89J@wv9iRQ+?zj?s_ zVB&ZSi!#0UEa=nxaDTgU%zQziM|=J!^J^)MaNKko=_=WJ#)vM;!|JtAg0yGg5dm-u zxBsn;^g7nJx3j4Z4PvTL_u(XgIY3YpEd$R>c%a}A7)Yek&?Z^g9}-v zCzw8NQU#mvw_*7au#`w1slG!|^NP5ss2fcw4lGG?x{Crfs%t;Ar^rs%E*DBApJXEL zI)19^)Y@G(AGd**n+IdkT`ko$1ay9y+@Sp(u#L#jUxMUNP<)9{P&oep%-O=w$<#!} z#R=kKbpGEQWurdBcALPoowfkq&}pO@7m6Gdsa0pX??N)Qf#|EU(#Xr{P-4n#wh^kQ ze{bR)P-4-LE#qE`uSt?jw{3Q1`!bB$Pl?fz@7{7($xQ^Yd zG4H-SL+FW=beBsrEz7=XY#eY3e~f6v+iVRSJKQDhGDxdyg9pHkZ1c4q<81%UB#SsEr)yshe>#_r`xI<$72;=|*15ujOsv5;#yNZ!@N1}R zt&=oluFKXk;NgM1t$S@Ub;}z&%V;O7sh$vsZavX4m$edLeqV%b!RsCFtkOOU%*S=M z@;ZHD*m>jCbO@Ja{gwAuENA7(C`bSKuHCe2a(VfufI(v3CiX>r=LgwzZMJp>?{NpL zG{FZuK9RmO^CsV&a2Zl2J{M2N-xAJUKP`Ex7&Bw`gPo_10XuF6`+--~ZF`J+JPCI; znGQvsQ<>mU-gh*4*j>cM{-cv3KpCIAt$TecbM@&;p(PR1?^tj2GXXO7i#dH_n1sDhXOuV4VVM0e zDy#xBHHI`lr*#qK$!s^ujyW)ZNqc4OR-a&8wo;*eMARKfozWNEeDdTB!xVOk3_qm4 zCAG5^N3m>y{>63q2MHFj;w4B9-X&>Dy^1dJ6H~wA*2&A!T517@ej|wwYAEm`Og%Mw zfVbQp^AE2-AfcXM~evxG~*!I&6fY2;wvHlLpVl1Nkj(N%ZOrKFi zYYCv=z@+7BOvBV?%9(K&;4ybiw{arPcpH0l=J{wyp2YW6mCEZ8DofjVtgpLUq!UJd z%c8z;y2HZw*<#ZAMhbS}j4&MB$vC)S$3!u%;*4y-m+_jIm9N%XQ$ngCM)+anq`E=7>tZUZ zp$_b10t6KF%IxIkNP;F$DNH))_AUutVBk2x?GPp2g6`GoVdusq;J2|66# z4~z)Yc#b0|Nh3`0*XS0^4^N!WwR^G4xI2r&Bt`7)#GN0HY4j9d$F56Fa~ zt!Vc~XGF}NJQsdA-K6GvzftzWTjPI9TfyS9_4bno0su}BhT|CMjM4;C^?MW*An?K0 zKt;w{9G=x@1k|N-E+1rhX2v8?O6Z;o9Um!p5c@-l**QtoC27AqR)}KWo;8{QeAflY#H=$yA8bgOVY$FUko} z+%stuVieW)Oa0giWg4(BZCvG!LU9UbjSQ06%Hun$%^v7*)+i!T{F6^o^)24~^aGV( zfDut*BLjO#Zp5a56KAq%>JV#m$vWJzJgHqy+2?7uCzur?3ur;>(mN{8dDgQ&dNzat zsAQYr+bSWimt75I`_n5nXSR^iflh_!@3S%^Nu?U4-k&r!6~0>ds-szvu5@OWj{;D< zZ$0=X`%)^pFB+!1G9nH;%HLRa?8s=sE7pw=IkN7f(Vi~*D9+=Q7Q2RdM2EIGkxTO$ znLn8;t|0g*{^?Ve84S7iX{GP{PDs1R%5Q7?8JEXnFO`Rax5lf_@*9@5gYo?MhmVDH zX(2}DND)LUU!Lge;D0kj%@{plBH{Po}Z3?uX- zthV0|f#u06RU_uTPMP7RRns_pWs=7Cc-?t0X|di+(1_S-Fm5s$sx^5$E({#Y3?l4C z;-8?9=O@MgKv~zH<-Ez6DWjeC-@TKD#nIwYjuXgI%+S}-K`$uobm8~$hE{gS)GJPQ z_m@RX699x5=_&NaD*`T~27QQJsgkpDi|Olen$*Y+0JKxizETK26D|Eu?e8^x{0pdo<7n(!{+}ajgo|d5ep8g%Qk0;fK;b(Miz2D_9!m}e(P2`U zr_D`Or;=iT@-I}k8l76Zh~SA26TQrymN5B`AIH$jxUExlM^70xkNmA?ra4EVMk04X z%?izH@G~k+ocrHJbzcfUHvAUbQd7cykUw@2y&QAt)w}R1D6bZ@-14V;!)sdbFSivpqX=B0KuUhcbA&+HLM7)1m%ntv;BY zs|=Ge!U$%sjWFN8Of^cq#wc+YG?eGUgf4-+?U#p)`u4Qpj9e55_oiMVZwe*>OdGo` zuRi9ELYEhl#ZFyGMa06xQ6`{xL;jn9X<8sV8rCBUSs3?JQ)SP zjwc+GFNJx)9x0RRfgwvQF3Zt-4PVQ-wv6}ChKrNk&Y=?tQU&LxTwZOgoV-s|uB3hv zng@0Fd8l|2+9XkSf|u;e@37~uCkqhtwz}wYmTAR2@jcE&8lVq`b)F*>nP;7nW@h`P zeu)WnqCR~Ytvt0q%ca;l!KeD|W`%1A?LY?N?68Z}!jZeJ{bD=mt+Qg;M*k+74un_q zGU#xX2VdgFu!7*6euerc$~#kUt{!iFy7j>gjWk&>=v@didl2>v_oqX8it7k*n<5Nk zRSLv(fArukk>hB}IM1Uk(RP48O2|2oLOC{L&_S-iV>{gmd#yo2fEG5;slyG5)6L}T zjwEq;1nN{7BDGR~y;+`cW-JpcAasuWQ~750)jT)}j`h*uv#O`|i!Hht z?Uhm2g#rV9cJ|e+`H=!ogJ*eG3X=qzHLz}qXJo+lBaOzsjvGx)OspI;*Y=v7Fcfl) zLEV|OHuf0W03X)Vd28+^vOdyPHJ`BL?2oP4De0fSYmTZMoL`_x!{sr7xJ4?O?_H&6 zb&EHG6Oe!YO5LdVT8`RRyv|d~_mfVb^I)l)UhUZg`B%(0@#dt|C?f>-DRuVqwV&*+dS5P6xqa=4!-65gH2y5;GeLoWaEr z@JathM4+K{nmaLd)taD3PUD}{f2?;U9`jg$hAmi zoXhIvYAwgR{mE}3r8JIc=s51T>oTTUV4)e$T=nlejWd#UP^(im z1jndfK3}R+t||?Cg!J3ux@Y}oksg!ii%m|3z^}wi6oc%VdDiiFag6LYdq;hsIJ_nD;T(2SJ`?c_kt?XPUCEK>VMR96z4HBvAo_GCs=JO^wm!aW}x#hn>3LR%v8K=>i zGqpeVCv}|742d5bICqiqZ{A(6gK~%`Su`_jf1gkhFz`EvH)&$gvy#FNFRtL}rNw+J zNI7auwUwQL4@PmGM#yUEu_hN6W4Gq_>Xon843LaPnHK5*jGt{!Yuar?{T}u{N(@V> zyLs%*$Dq*=bc-ch*7LuckwnlRFI}6TuF2qo8ua^xQLhyB>>Q8bCb%y(bdNvsvSh|r z96WbTSXg#MiLNM$P`)1Th83U#z`h>w6hoVTO+o;-rmzF8>)B_ECf9s0GTa`+I zZd9&Zx=mC(^f}cf%IzhCd;9v&8)4K%aZP80w-Of%za9@yOD{Bg41>V81>xPgPZZx# zO}deSa~vkr9C(vY6R1sn9b^Oez}>2Wq`trSLe`W5}JFg!r<- z!_ttP7>cTMcw*)~gO8A`Zpc9e2TvvWhPRQ}O$10X9_D>-qQ(~a3~@(Vs8j}`8G0O5 zsqArQruu9t6KSH%L(uqvIkj3HI;H1?5@k#(^+z#i37_;D3wvcOcWKQwu-xR&rVykp zjw|A^^7f9duB#5Qyo{Ss(s`|2v?YlC6sYGf(J=}}bCl|>uM0^C;qTeu%+s#j3Y!1~B zk~Lwp5IY(J1J%Hix|UCC?sO?aLZtw_ftYk~ja>T*4tHia<5`|xx6aUW&oueN@jF?* z+$NX75fuFNt<#deE;fEpltbI|TcAz30178tp_iVH62X|R)4M>Q{o@oGAC)whBEqH2 zhaN8Z2x9#$PuV@IQ%dxU1O%Hio!vVxf&N*Auj0B}cawGVyW{1tIm`VjXV;ev%3f7^ zY!Qt0TOomx}W4Bo=$C5#?$zJ7Q9jZx63A|GkNK~4r*AXAz`tf-pq5_k(QemD4 znzDl8i((sVS)ilDSEJ>Smou#1VbJuxCypdWZQD`Qu{2P?NrSKR=lzNxBg=^5jZFo1 zL}5Jr(R3hMkL>RQ4T5*H@3%bS3eU>A?EEFG`VHV&gmAx`MIP9O?((O*ThTJLTt`_! zaGay)>;AgY{Kq_Q?-!+ZUT5_uj3F$Ky^B;2z6g3vn`z}>aL}>m@N>Isq!_C6JbUu- z1o(8;MM_1GHZ0^`q|R37i|!@?Yc{_B#{}iUn1x3?C0nX9()EL)rAKeGr=X*IyPs~SMWLwrz3l;FV=Z^8IDChVEi|p`EKcYv z5MB;+KpK~;^~26Rz`!lbXhRZt7f;VZo*dqd1V%}GYYslRxs}Wk`-3jpADvTL6*bG# zu00wH7h2GXdD$K#4F-PQvKRb-IcxUAbm;sfrew*4i5ZSrs7~|lC&J!q`r@Wki^hCz zoN=5_y+J=!5Zd*j2_5%3w3@Z$0y;h@xa)pF{HQdZ3i4S?<60Tk^9x?DC38a8@)sM9 zG`{La`N%!ZUki&;uJ_|*M;oiUYFKKa~3F7uuMgl)#UT;{iG999R+25d*LvZ196-1`PWT4Q+a>P+M z87gqwb_}L}gCiIWq;MNhe4lxA86ic-R*5kh$JLY5oW~JY{s2Gq9!-MW@|tgh5Z4#E zZBGozTuOkUZ1WF}r2PydCdo(!s^p_Qw!iWeJ}mZ!`F10BkfiC-a8wivF+e}Yr5nm- zr%1+@WNACtiH;$k)4b#D#IxF@uH|l6&9iIPv;QbGu(r@82;TY6_hQtM)iR-k4dKZ6 zqw7n8nAAf_?CL+V+i&?=ET~%w)>aDem0c}q+{9b0zx{;0t!$;^1Y(j0i0d++njiw+ zJ!s@(eQT8LrHyP`+67rF=#Av8U65^N*%waC)cg2zJl5w`d)8;VDw5K;S_1HTGGvPn!|-=h+MtaaVa}8XJmKccI{d`qO~}g zJ+i}91?v5wuEN*i1&^zB@m(gG1gQOT+~B&j>LCX7Ra(OJQrtA3aW#0iYoAnRq|fCp zrQ*88<1$b0>Xyo^B&?8};68xBD@{6vhyVe%)^=BDo?cdfJkG|Ha!TinsTYk+1p?NfG=GB;Eq{;>Nvt(^b$3_oU#i${#$_R-kFkH>5_zrJszAp5L#W zf#W+mgc-{IK)bOfg{YvF)7Gf^BIGG(u^--19D_YC_kFsT&HE-#%btTq!=$wK zbCdcf%Igd@B-oTzF>^s(l3W|-C^>BvuQYQBb50quwiN^EJ(0qz)_Q`$EfTM~N*cNM zF*u*f(zWTU9_u^P79?`g^(vp)xRn&(1Vz73gUW41VS?fGrE?i$Dt3p8hx!_KyZrfX z0N3Uz)SUP4G{5QxXRalW!r<_k8>tXgYrA^`FePdxbTBeSPi-p;CyHJQ&{c{9uw+}I za|K`r>u1QHyo~{(+^ezP0EKnDBcwMg9R-HAw<^-RjdjfvG|odvP*oeP82E+1yBwD7 z)mIXj@2(Fsq`jC3v+G(F3wzvv((l2a68jAVj_=#o8O5C>Y~G-SD%Vx*a_8l0+X|k^ zzV+Cdsdi64w}c+GLWSiX#OO{F8_h?XAx_hVUTWU7-yjO2xpFMtCLGNopws1_n@c|M z8;(6=SNv{tk@bf)H3EybTVd;n>7xHk(o{l$HZrnG*@#MzWdUw~rs{}fm(S2#vwtD? zBDLW;i5G;Q&Lkj3t&Ky?I_#fxgJ0AJhFNsiu6R?ZF+MUNJ>{%xRVQAkM8rm&uUB#2 zbPt}vZ1bvlw7C|mxQS~zdHLYx4ENInj0c`s2xlAbMhA6eaBQ{Jb*!ZRX!mf8q$-uS zW6zPJw(<&lqLW>UAxNLM4a{oE-1olp>yf$CSMIb_B#5Rc z)_>)Ev2R>anpHkUn9MQURl^roa~0l-e3fa(@{LtSEbs|!^ZbT1c*tE^o{ zY+8GY>9--OKXcN~TgnIsoo<(Sv^&B)T6v!L4g~fMU`knFRGgj#ax&@&c0%vzPet2| zvAc_fcGUu0z-(5`H`>JaGFPg()BCZN0J-5j%cSLFjy1=EpDL-Q$LZrnS{u9Zd6(&V zc>|epL8F;+B5wI6_Nbvh!cO*cI92-P6DgYgBgt*jo_8IdaP>1A(oG1alxWq!B^Wi4 zcrx2sQUgiK!%9_z;ddp=pvKEIF~OW8mQG!xbH%x{`t9{BB>Jf;xtxZE7CdNl%>{zx zufB!pJ(d1`w|J&(6^<#7ZnYpgyJYlZ+}b7#=dT{@afS6!o|UAPTWMh~`50YHsaBex zVkCB(%{c;W`}Cb^4f@aH?D&Q)gaceT9B8(DC&o*FauUT3!p-z2!LS%QXieNz z^Y_X$u;sT5CqOC+7)xBhanu+Gkk4ioouK{VcdZyUNmF) z*4+kuyf3{Kwv+09_wDg1<)!NCbF5fhlL}wR?tN)gxc!jiVQqo;JKsoBQMb1H3&D@$ zAK8GNZwiRaCzs4B%jSPY^SgK0AVgDxQDD6a$Du<^OBO>?5rfvaYQID?^5+9t^bL#4 zP(Ih`@g|l%8PVba@ICPpke4&l2r(<;!2TtsQL3toXldDERJ= z*3#Bt_u8zARWjzS9!CeIkNWpn2pY{lHY#;!7WeFq*Y$T?IYBYY8s@*tRjLhE5Div< z;zUnJQw)WK^mHMb3R0&OWpeHl4n3)8a!F#58XEG7d91L|P&I=NwuLt{w791G05Dt1 zH?q>=v(;ZsYv_i_`Y|krwla<6{m4rQ63DSUxI&=XL?{=Nf}Y!u=Ab+M!V7xYK z*Dvdvw_agopZwLfP{$DA6tT>~iEtwJuIPyAOKrgH@wL^NQ$^le(p%-3`)ho=N?m6) zMvXi*zs|gxpqkJ5bHAOUQNcp?H&;$*inQ{32W4i;6{ToJ4&EdpM1jzZrNE4q!9a8D z>=_)1f-w{&zh6%v|JJotAL=g-)z2HoWKi67m#hRi+FahB0@sTy@RP#bB(Oh4h{~v5 z67t@ZWc}X#1I<$NSqmzpgsrQ9_v0CZ@n{NeWc)ynK@#$l=*qx*EKkA)`F+h=IZVBF zZWx;sLVgRTYmL>(Cw}no^sJ-tN~6DEL_zKyOm+Ai@w@RvQp<~lMJfdkxHoZ@bT{WWYR)=3L#fg^Pr>^ok`NL+)fAe|EibhGs8cBH&GmjX`STO;UZ+jhYL=}~VSXW3p0%8Q z6|Tfcrsu3q4X4%HZg^x~-;AR_0D+lC28o86r#5k$?F+5KJ7tf?X2@Zg-L zsr2E=*Pv!l453>Nppzw4Pi#@rpnRteka~xy5$qW5j=+P(;<-7oVK|%DYZN| zNOAxHj+XABhmtEAgiHG~_ofZf9 zinX%=b zv%TS^wCF3_(;n{0{k&S3d{C7Yh(EP2;TeFBjvF`izF3d2U}>Y!02uj5p?5Dpfh*x= zFschcUT%A2M|VjZidl!XElE(SV6WZ045yjYt>I6YV+E2h8Uvp;0hkyy*MB6N!CPj2 zs-q$a^yMc~USlg3D%ZZf-U4O5IwhU$I!9_>kckarR2cPF20td$)b_=oT=!Hhyc;4v z;IF?#vaQrX%(B!bIK7}j*-y)giT@xSAK|4*)FSZk{5P*Dem+IzCi(p9Vc zkxYsdAW)jUa{NWF_B(f8uT=eyOvm}hL$73efLldrHq#e+!V!ynlTt76g9EsHWjVlZ zUZY!63^`dN`Y~Fo)VuA9Xnn(YZ)KxzHh2Q3@R`!RZ&vi?dgJ+GwRIp;=1iS_^{l!| zk@*2u;Th`XzBQm5V@%_wE1J_=S=7__O!1xI<#Np=+xYC*p<0_0skc?ysHLF3y{?a! z#a(wm(oL_Ohu#HZLuO?0VghTsaxk9{oknwHY+12_Oq=pcah_pHqnnpTXs z@Sbv+^FBY%$!WR6RY3+ulb%ddc3E@TvSCV#_n%(?>CH1qMM@s3J%0A`tTs1^1(U*L zl8=I9n(b0ehHP<8>PqR=o-6G5Y7Exwr(;bat9^>6O`t5I`GHN=f>Q0_ODdZ=4QbmH z#gJmbIPS2i7=!}-)cD*o73JW-}cxSNq$)r~X9aT_2;@ynRn+SM}add7UWI_(kFtN54NLz;}!J{W^oqD=#sdEf*0f#POq^pv%zSMrR;}4m6U*?aEVE>Yz>8O~bEf zY$BPL>o-q``C5Gq#k=$Dl)!oV!;FwtyALx~N9Z`LgTU?`(zkBVi(Jg=IN@_&(F(`z z^_L<%erf1e)_wkyqp^Ah28s7K-w}Xf6i_T!oi>RKqz-%3c6TxlEW^hFZ9kWAA@%ji zlNQ_+!H#~0)#*dZl9}&|b@O3V_e*>KiEVa6k8woeSenJw)Qt(&Z;7ibp;B-gKs49r z+0_~f#lA+4@^afr`b_%wSd@bTV)tiA@QxV_6cjcj7DZdc-p&PbicJ6Y@R_sj{}zf; zraUU$!-DCX6#t!L&kOTg{TETa`9WIFC*nbt`3`iIdfy?F- zk(5^!EK(8$Upv7$E^=smhFACvF3LwZSk@-kvH>@1pI;4fO>5Tit;eXpPhi!`r`WFN z@p$SkK<_rd`IBRoLQ8B619pTVGxr3qNNqAlRNl_A2lT$A`pWgP*BCgkVQEB${_HW~ zP>p4qY<1C8U{L@0wU#+RF|m4m_r2Tf3;i2;wgBI}M18z*;*IocBGE+sX+Ow;LueRA zNC?mWd<^rilZgLv`?s@p|ET|{rlOwf2|k*8Pxx1^}n6O z`*$vXkK+1QE7ZM-~JD>uWerd literal 0 HcmV?d00001 diff --git a/tests/data/Reader/XLSX/issue.2246b.xlsx b/tests/data/Reader/XLSX/issue.2246b.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f33cbedc7cb6b675100268dfd98a4e1baf5460a0 GIT binary patch literal 18924 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 KV8UT_2k`*+dHX>C literal 0 HcmV?d00001