From 146f8e14558f528a089bb5bc9f4107488b1ccca0 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Wed, 21 Sep 2022 22:18:45 -0700 Subject: [PATCH 1/3] Xlsx Reader External Data Validations Flag Missing Fix #2677. This PR supersedes #2679, written by @technghiath, which lacks tests, and probably doesn't solve the problem entirely. The code causing the problem appears to be the last remnant in Xlsx Reader which calls `children` using a namespace prefix rather than a namespace. That is changed, and tests are added where the tag is unexpectedly missing, and also where it uses a non-standard namespace prefix. --- src/PhpSpreadsheet/Reader/Xlsx.php | 13 ++-- src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php | 4 ++ .../Reader/Xlsx/DataValidationTest.php | 58 ++++++++++++++++++ .../Reader/Xlsx/XlsxTest.php | 37 ----------- .../Reader/XLSX/issue.2677.namespace.xlsx | Bin 0 -> 10987 bytes .../XLSX/issue.2677.removeformula1.xlsx | Bin 0 -> 10988 bytes 6 files changed, 70 insertions(+), 42 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/DataValidationTest.php create mode 100644 tests/data/Reader/XLSX/issue.2677.namespace.xlsx create mode 100644 tests/data/Reader/XLSX/issue.2677.removeformula1.xlsx diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 26cd1af3a5..4e015e9c7e 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -469,6 +469,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet $rels = $this->loadZip(self::INITIAL_FILE, Namespaces::RELATIONSHIPS); $propertyReader = new PropertyReader($this->securityScanner, $excel->getProperties()); + $chartDetails = []; foreach ($rels->Relationship as $relx) { $rel = self::getAttributes($relx); $relTarget = (string) $rel['Target']; @@ -929,13 +930,16 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet $xmlSheet->addChild('dataValidations'); } - foreach ($xmlSheet->extLst->ext->children('x14', true)->dataValidations->dataValidation as $item) { + foreach ($xmlSheet->extLst->ext->children(Namespaces::DATA_VALIDATIONS1)->dataValidations->dataValidation as $item) { + $item = self::testSimpleXml($item); $node = self::testSimpleXml($xmlSheet->dataValidations)->addChild('dataValidation'); foreach ($item->attributes() ?? [] as $attr) { $node->addAttribute($attr->getName(), $attr); } - $node->addAttribute('sqref', $item->children('xm', true)->sqref); - $node->addChild('formula1', $item->formula1->children('xm', true)->f); + $node->addAttribute('sqref', $item->children(Namespaces::DATA_VALIDATIONS2)->sqref); + if (isset($item->formula1)) { + $node->addChild('formula1', $item->formula1->children(Namespaces::DATA_VALIDATIONS2)->f); + } } } @@ -1278,6 +1282,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet if ($xmlDrawingChildren->oneCellAnchor) { foreach ($xmlDrawingChildren->oneCellAnchor as $oneCellAnchor) { + $oneCellAnchor = self::testSimpleXml($oneCellAnchor); if ($oneCellAnchor->pic->blipFill) { /** @var SimpleXMLElement $blip */ $blip = $oneCellAnchor->pic->blipFill->children(Namespaces::DRAWINGML)->blip; @@ -1285,8 +1290,6 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet $xfrm = $oneCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->xfrm; /** @var SimpleXMLElement $outerShdw */ $outerShdw = $oneCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->effectLst->outerShdw; - /** @var SimpleXMLElement $hlinkClick */ - $hlinkClick = $oneCellAnchor->pic->nvPicPr->cNvPr->children(Namespaces::DRAWINGML)->hlinkClick; $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); $objDrawing->setName((string) self::getArrayItem(self::getAttributes($oneCellAnchor->pic->nvPicPr->cNvPr), 'name')); diff --git a/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php b/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php index 57a88bb0b0..7f484c2f3c 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php @@ -58,6 +58,10 @@ class Namespaces const VBA = 'http://schemas.microsoft.com/office/2006/relationships/vbaProject'; + const DATA_VALIDATIONS1 = 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/main'; + + const DATA_VALIDATIONS2 = 'http://schemas.microsoft.com/office/excel/2006/main'; + const DC_ELEMENTS = 'http://purl.org/dc/elements/1.1/'; const DC_TERMS = 'http://purl.org/dc/terms'; diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/DataValidationTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/DataValidationTest.php new file mode 100644 index 0000000000..ddff17d64d --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/DataValidationTest.php @@ -0,0 +1,58 @@ +load($filename); + + $worksheet = $spreadsheet->getActiveSheet(); + + self::assertTrue($worksheet->getCell('B3')->hasDataValidation()); + $spreadsheet->disconnectWorksheets(); + } + + /** + * Test for load drop down lists of another sheet. + * Pull #2150, issue #2149. Also issue #2677. + * + * @dataProvider providerExternalSheet + */ + public function testDataValidationOfAnotherSheet(string $expectedB14, string $filename): void + { + $reader = new Xlsx(); + $spreadsheet = $reader->load($filename); + + $worksheet = $spreadsheet->getActiveSheet(); + + // same sheet + $validationCell = $worksheet->getCell('B5'); + self::assertTrue($validationCell->hasDataValidation()); + self::assertSame(DataValidation::TYPE_LIST, $validationCell->getDataValidation()->getType()); + self::assertSame('$A$5:$A$7', $validationCell->getDataValidation()->getFormula1()); + + // another sheet + $validationCell = $worksheet->getCell('B14'); + self::assertTrue($validationCell->hasDataValidation()); + self::assertSame(DataValidation::TYPE_LIST, $validationCell->getDataValidation()->getType()); + self::assertSame($expectedB14, $validationCell->getDataValidation()->getFormula1()); + $spreadsheet->disconnectWorksheets(); + } + + public function providerExternalSheet(): array + { + return [ + 'standard spreadsheet' => ['Feuil2!$A$3:$A$5', 'tests/data/Reader/XLSX/dataValidation2Test.xlsx'], + 'alternate namespace prefix' => ['Feuil2!$A$3:$A$5', 'tests/data/Reader/XLSX/issue.2677.namespace.xlsx'], + 'missing formula' => ['', 'tests/data/Reader/XLSX/issue.2677.removeformula1.xlsx'], + ]; + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php index 6b0ebf67d8..3050fa7296 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php @@ -3,7 +3,6 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; -use PhpOffice\PhpSpreadsheet\Cell\DataValidation; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Shared\File; @@ -163,42 +162,6 @@ public function testLoadXlsxConditionalFormatting(): void self::assertInstanceOf(Style::class, $conditionalRule->getStyle()); } - public function testLoadXlsxDataValidation(): void - { - $filename = 'tests/data/Reader/XLSX/dataValidationTest.xlsx'; - $reader = new Xlsx(); - $spreadsheet = $reader->load($filename); - - $worksheet = $spreadsheet->getActiveSheet(); - - self::assertTrue($worksheet->getCell('B3')->hasDataValidation()); - } - - /* - * Test for load drop down lists of another sheet. - * Pull #2150, issue #2149 - */ - public function testLoadXlsxDataValidationOfAnotherSheet(): void - { - $filename = 'tests/data/Reader/XLSX/dataValidation2Test.xlsx'; - $reader = new Xlsx(); - $spreadsheet = $reader->load($filename); - - $worksheet = $spreadsheet->getActiveSheet(); - - // same sheet - $validationCell = $worksheet->getCell('B5'); - self::assertTrue($validationCell->hasDataValidation()); - self::assertSame(DataValidation::TYPE_LIST, $validationCell->getDataValidation()->getType()); - self::assertSame('$A$5:$A$7', $validationCell->getDataValidation()->getFormula1()); - - // another sheet - $validationCell = $worksheet->getCell('B14'); - self::assertTrue($validationCell->hasDataValidation()); - self::assertSame(DataValidation::TYPE_LIST, $validationCell->getDataValidation()->getType()); - self::assertSame('Feuil2!$A$3:$A$5', $validationCell->getDataValidation()->getFormula1()); - } - /** * Test load Xlsx file without cell reference. * diff --git a/tests/data/Reader/XLSX/issue.2677.namespace.xlsx b/tests/data/Reader/XLSX/issue.2677.namespace.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8ed2eaab0fdbef450f4cf29b00ddf78c72578b41 GIT binary patch literal 10987 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 literal 0 HcmV?d00001 diff --git a/tests/data/Reader/XLSX/issue.2677.removeformula1.xlsx b/tests/data/Reader/XLSX/issue.2677.removeformula1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b7f6cc5cebf77691c529937d8cf0c09f6d42fe35 GIT binary patch literal 10988 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 z zhixusi;~QP`7%4mMkAuvbA~|Svk^-UDRPX5NS+W(u@x?A-BVq&6Vxk2$2Wt04y%-N z@HZ8aYtRW5mdZJ#`)RM-d(Y9$uKjez;JTSpEidMbX1Qs;9qx{ls#~2H$d0q&8y_y; z_8JO>k22=&i0j7%s5R9w)G<@=y`6Rrg1UCm{V1QvC#pf$7GG);EYKE>(fjd@RLm{) zs5h!BgX?;Vv+|xAFE3}HH{`zH08Xh&HT;+%rMrLfj5S*QH|8tGrMuQO^+!GP_^yuj zr;-PBlT(6WKwW2(eOQDR#wHwxsG`BAU2M_H(;f1CooOTI(xu*&22b2P*82VT>6A5$ ze)1^->zyjspAgbjXg!vqR*R?RMd=o4;IrjEy%=atid<~shb5c5|M;yu^J976%j#RM ztm|`4CTI2G>}mGu=9(Mj;ms`sRc_BTi5s6Eu}rye`7Zj*v@2+>2NY|uX8Zv{%W)F| zgK7v4*j=-gT_)=#gqC>m9Cvhy<9;D#WBBw3W;?1T<)z(OY+ytb0+rq$ZbR&r-81{! zY_i>WhfSxaWp!y2M*3yetq5CH*~Mn}J#Xxa^=?E;TZdaY-wbv{qV<_Hp{a$VU2Tzy zuA7SQzIz{qB^Qo`RP2XWZi@M~8ZfD@6!_K-MQ=*m54VWO#G+5g^R>F8bk^YTZuwfa zRT1!2awZ;t>Y5$mToU-MiXg32J*{NHT6BTETN1bkOMyh;f%dI_(xxTXtTM|}lIbFa zA+?PRSh(UrQm0Po6hvTQ#119bzLBb55#~_EF8nc7FffkIC)PZHPx!Md8E>d}TH@wj zm_LD8h9jA`r09npuDv1~RE)?L38|&?>GQYqZ!kv57Mh%(VAq4Ws^J>W^YLJWnuB9# zF!+#d_Ab$IUvI(h)Mz~(bx9|Uk}W-q-_G&nIr|X_MTK6~JFTU|e&V4mT_MEy z1gDLrnd47`ToU6pT0#3>WRIudBdjS+l+-qzPV(*$;ZwtT;8{u)9%1Wockl;ZgVnn! z-z%jme)9w~KQpb$0(m)LMn|W}N-e#hC{u;<{>;e~`A+M0(gCT``_f(p`Q=$2RK&^i zLB`3HuLqo!JbVO=a(rKdzMP8M2Cu4{hfHGFd!Gj{4OXhb^ww8TMb?~*jB4AuIS>pK z!rX*A(}yBcEonMKis^enWK2NYB=WIWpsi;CcZ#-FnL>~9wBg!9l_?H!f~*wjIlJ8& z$B=uhT1Zl5KFe`nI#gUE~PQd zjQV;Zoght*wx6JpzHe(B%G0!UvkEn96rhFtEMGWwIKvyNSEYS|-AJ(|>t#(cF8&p5wnIP$zP@%TL z{8s8DzMUF|T+Hka({huj0mIlN{)WFhww71^^dxmoHnyAFc9y+axS`jLRkHbz0851` zrpPqzZh3dKsO+TCYt>F4VhRbh@=Pq1)W{%|>D+c@{a9kbR_*9>@5Z%ubwGYu*nUBE zT26`DV9-t_egqYZfjRY1_H-@dj#eY%t1NDD&k{r3=7#Lz&;@djEfLmUn^bCk^g;R^ zvE`r?eq*lF8tlFLh5W5Sku@iEKYb=8@^h*;vJ;F|{@i)xNi-{qo@CP8gQUl?LK+1& z(zpGmZ0>eN?I&~!$;zrm>L>uu;TDpPiWYns-lB7E+~7Ch$10uy-n2dx*hjUe#3Su! zBl}-WTBYsZ$%pUPu*Q*3Ua_(J%nDPJQNu@|k)`#ew3f)rPTp0;5iiTB@EBQErTB2G z`t}eIh)x@no}F=R9qc>gPuZMDn)82nb<3tImbxn%apH8r6yc&)4#Y=)*R_=s&OaPx zC7VCuA3)-{css_c)3WPL2vobwSEa7}kw4H;Jn02yw+@zhj;C#UB~jgTkcP7XUyZ5$&1xdDzP_)v_K|iWdncJs=D!J;*Df3qbUm0C}dLVVJlGNGLKBUW3RiPv~vimmHSxrf_Z;>2P#WELh*JS1*}yTmwaU7o|~P9lMi9Sit)#dp18 zYX1I)&*w^Z{rsKjUIP)}ooHo|`>Ahh>6Bm^Yrmnx{tlSHbR}BHsjkX zZ#^}eZ+wP2sRc_2ZFppPFc712ZgmQBFq$RS6#X=4@H)d1+>x@fh{L4$s5j@Dl!sN5U#B>XVL+yZRi^-G|j))(i*^Mi?2-3b>-+T@t{g(Q<+ z@jS~NkBTqez)gkGAwYVCVGb+vOo^9G+m}0H4&V&AO_yC4KDzG$d!^|djrocqGN(l6 zsBv=uW!N!CJg0T0;?=9YUfy}(hG8i17cmVd*wO@eopbvztvgZh@4g=gHnR> zARUPL?`(jDp_8eJii?w_o%tV0fozpwyG2&icANo0Mh`~>o;MHGYL z#?gQphqRyv;AiU2b&`V#cEvZ)KD&uM^XntW^?t8;5Fn`8yMX)8cKHBb9Ip-c*!w$U z=ZCTYjR(EOwK}EF#3^U*i(+b{1TBTw1&;pG@&dbf`AOY~-7PbMq)Ep9h6-BhDS;!j z`FX1r4SrR5f|@*pdFR4Z2B`V0o0tQ%PcPLAnX=l>55q>)40Z?Q*%FMQ?LBn2B_BHh zv)fG)1qqhO>cL#Sut8t)#DHkKBV>5Iey}qUaFPor@KEYsmm@iSEp4NEY3c2S!)M?z zRz3!%3nPYz(S@Z`?1J&t7CbAUBnY_^_5Cn)d)y3RO@Howw2rq!o}dF4Ob)6ew`$e8 za(aXFRZei&hO*Wy!xqk^i7q3$czk)*S)!qIg2esN1y*~cPwSC;^l5d-Tu4Jta%lhT zGQ$DC3zH~Fs+R6s>SRT1W#(lrv-CHPII_~D>dK+A9d`f(u(3bprZUoP0tx!z_}y2CwR zU-@AgnlM&ysF!O|-ZCO~Xm|KG^Uyz8z>_h83)`aWXe{=I;Oa$0;VEzxgaKP7us*U* z@fqPWY0OZoQRR0CQeh=?9mCdjgyx^?IMpfn=tnNNp)yIE<@>1&^j$VYtp-)3`z-+} zs>`8KwKb)^?ecNe`2FUlr9axj9lVAj+t@8ymsrQUVLy5dRi@ue{QmD2i&e9Tz3O!1k zaG;Dr*NudW*ko*O*q#^mbKkHS^?Jy1c>=a)&|9Hwc~(tktrwrP9~OF-i61xAKS>Dw-wl)t^&mkLpAw#-jVC zNMKxo&{hd5%JmNEI)_7&EjjX!IDAj6;P*HeuWZvzheOpRAYVf`PO`dN2jj9(6!!SRIU}G>}BU z1}Ps@Q2olp-dNGe-ocs0(81xSyn-sd|EpSolyY{muJs}-X4nbL6N>OnY<5Emn#sGw zrb{E!z@pEyn;ROksUa>#Nl*7gi&L(x(Ot*i(pE2a-!YyjR2dT$*#xuPIVm|nuY?TU ziwx@DD9q}=8ZPrK);(1`=P>cBsqPrCg-1iz8i=9vVfGBhofS5jd{c1|w2;H=Dp@5i zJt-8@+5}A;^r~r1sWR$^{1>>cw~D&`QVH=<2gomP8{kWJhV37mDGjJPzwTC!OO~p# z%oHVv#2$(f9I$PM3FIL1&}|zh@wgkr4gS!?QXWxh;aKPjQ!mqMLsa&`+~n9@>8NU= zW0+rWg$O3Av+++3WccQ{k0_uq$oIbTS~B2iE*-Hh8ZX%^sL(ZzusUE|*qKrkpD;^= z=f#Y8QM(Zzn)VanA(S|&l}^Di(?mVVl{(EM&fOPQr|%kR&K;31Jbe)y5+pig5enA8 z{Md!u4{TzqRWI-KH(v8wgt+&!L_5vyLSpGoxKOAFy-uDVyduvMe}GUu;qV9Er=4>@ zBU^bk)7rte-fPN5#fR5CgFeZB3iHuj!PiXCl~&M!3OYa~G-E>>V-X8OOS_-K%pcbU z-_43DdJ^=4dTrMXkDXW|5aAc-_eOG-I>APoJL35>+SKru_P~t2esjcqAx$46q{R{_ zF`LOv&l!g{J#H99WkdyPN@^q)blmW(@@DF}WR4s)TZ8d6Y0bC@BO);hIjsn5Cxus; z%CHFD=3ZaolO6SO3;`6_lQYSQV3?n3|*CbL@7E^gwJY)P9HZ_&^96$-_V|1v87EZ zsWN`J!JbPHBk{5M-lG4##gbi6wYV9^HcG1`0+Q_f&AAq)Q&vHm&)zE8cMWPN25UGv z-XNii!+ZMmsB^8J`UOjT&Ux4bhiPj`mKk6AYCAnIeIPmhqDRd2uRs&ytDRrBOAqGdZFjm+?3P$k=m+&@#W2SR48 zCC)L|oAgyLe*;2Agc~;*JP3PK_|bNCA|bE1?&$;8TU;7WoYeI;`o%g#H8I6|QA%I8 zj1GqMvAzGcvUtO?z1Z+1<|=(g@`I5E8JIu07vTYIqI*0{lH~jUBXBTqCXgTcr-Ar; zzuuo4|L6P<-Fu2Me`oObHljZXf6nEgTmGe~=y$@uw^sa>@H@!K`o9}3e&_RhVf_~; zJh=ZTv;R)~d#UahF(jyR2YQHKg}dKLe=j5aA}s_dClKlHMTMUX1pf#D{we)I`EPns z(98(RhJYCSV=@FD@N)$K)M$bWNKngKCgsgl2s-yik&5aictbfSN~?;L*j ze}8e9CH}`}{lgpnoy*_7kzYIjfOs+h;CJ8Tck18O|1WwS(B^^m>u<*3cj~_@-Cwi- f043F5?)|3Q{21i6~#=fD34U@Jfk literal 0 HcmV?d00001 From c1418d3aefef1e60d1845836fff4b13ae1516fed Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Wed, 21 Sep 2022 23:16:59 -0700 Subject: [PATCH 2/3] Scrutinizer Reports 1 "new" error. It isn't, but fix it anyhow. --- src/PhpSpreadsheet/Reader/Xlsx.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 4e015e9c7e..c1347abfb2 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -1366,6 +1366,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet } if ($xmlDrawingChildren->twoCellAnchor) { foreach ($xmlDrawingChildren->twoCellAnchor as $twoCellAnchor) { + $twoCellAnchor = self::testSimpleXml($twoCellAnchor); if ($twoCellAnchor->pic->blipFill) { $blip = $twoCellAnchor->pic->blipFill->children(Namespaces::DRAWINGML)->blip; $xfrm = $twoCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->xfrm; From 54694a78a90197dfa94cd07520c45fe5e33ccb6d Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Wed, 21 Sep 2022 23:57:48 -0700 Subject: [PATCH 3/3] Fix One Existing Scrutinizer Problem Only remaining problem in Reader/Xlsx. --- src/PhpSpreadsheet/Reader/Xlsx.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index c1347abfb2..06a3d9e7a1 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -1371,7 +1371,6 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet $blip = $twoCellAnchor->pic->blipFill->children(Namespaces::DRAWINGML)->blip; $xfrm = $twoCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->xfrm; $outerShdw = $twoCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->effectLst->outerShdw; - $hlinkClick = $twoCellAnchor->pic->nvPicPr->cNvPr->children(Namespaces::DRAWINGML)->hlinkClick; $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); /** @scrutinizer ignore-call */ $editAs = $twoCellAnchor->attributes();