From fa880c4d3a6c7fe8ba8d5d6e2dad0eef5344f23e Mon Sep 17 00:00:00 2001 From: Rob Young Date: Tue, 6 Oct 2020 09:27:23 +0100 Subject: [PATCH] Support xlsx sheet sizes beyond u32::MAX Resolves #174 This PR includes the failing file from #174. It appears the issue was that the sheet was the max size but filled with empty cells. However, the length checking code only supported lengths up to u32::MAX. This change means that xlsx files with more than the maximum number of rows or columns allowed by the xlsx standard. I feel like this should not cause a hard fail as other tools that produce xlsx files do not always respect these limits. To give the user some kind of indication of the issue I have added a couple of warning log messages. --- src/xlsx.rs | 56 ++++++++++++++++++++++++++++++++++++++----- tests/issue_174.xlsx | Bin 0 -> 145592 bytes tests/test.rs | 10 +++++++- 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 tests/issue_174.xlsx diff --git a/src/xlsx.rs b/src/xlsx.rs index 28c827b4..257267bb 100644 --- a/src/xlsx.rs +++ b/src/xlsx.rs @@ -4,6 +4,7 @@ use std::io::BufReader; use std::io::{Read, Seek}; use std::str::FromStr; +use log::warn; use quick_xml::events::attributes::{Attribute, Attributes}; use quick_xml::events::{BytesStart, Event}; use quick_xml::Reader as XmlReader; @@ -15,6 +16,12 @@ use crate::{Cell, CellErrorType, DataType, Metadata, Range, Reader}; type XlsReader<'a> = XmlReader>>; +/// Maximum number of rows allowed in an xlsx file +pub const MAX_ROWS: u32 = 1_048_576; + +/// Maximum number of columns allowed in an xlsx file +pub const MAX_COLUMNS: u32 = 16_384; + /// An enum for Xlsx specific errors #[derive(Debug)] pub enum XlsxError { @@ -294,8 +301,7 @@ where value: rdim, } = a? { - let Dimensions { start, end } = get_dimension(&rdim)?; - let len = (end.0 - start.0 + 1) * (end.1 - start.1 + 1); + let len = get_dimension(&rdim)?.len(); if len < 1_000_000 { // it is unlikely to have more than that // there may be of empty cells @@ -578,6 +584,12 @@ struct Dimensions { end: (u32, u32), } +impl Dimensions { + fn len(&self) -> u64 { + (self.end.0 - self.start.0 + 1) as u64 * (self.end.1 - self.start.1 + 1) as u64 + } +} + /// converts a text representation (e.g. "A6:G67") of a dimension into integers /// - top left (row, column), /// - bottom right (row, column) @@ -593,10 +605,26 @@ fn get_dimension(dimension: &[u8]) -> Result { start: parts[0], end: parts[0], }), - 2 => Ok(Dimensions { - start: parts[0], - end: parts[1], - }), + 2 => { + let rows = parts[1].0 - parts[0].0; + let columns = parts[1].1 - parts[0].1; + if rows > MAX_ROWS { + warn!( + "xlsx has more than maximum number of rows ({} > {})", + rows, MAX_ROWS + ); + } + if columns > MAX_COLUMNS { + warn!( + "xlsx has more than maximum number of columns ({} > {})", + columns, MAX_COLUMNS + ); + } + Ok(Dimensions { + start: parts[0], + end: parts[1], + }) + } len => Err(XlsxError::DimensionCount(len)), } } @@ -691,6 +719,22 @@ fn test_dimensions() { end: (34, 3) } ); + assert_eq!( + get_dimension(b"A1:XFD1048576").unwrap(), + Dimensions { + start: (0, 0), + end: (1_048_575, 16_383), + } + ); +} + +#[test] +fn test_dimension_length() { + assert_eq!(get_dimension(b"A1:Z99").unwrap().len(), 2_574); + assert_eq!( + get_dimension(b"A1:XFD1048576").unwrap().len(), + 17_179_869_184 + ); } #[test] diff --git a/tests/issue_174.xlsx b/tests/issue_174.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..73876113d5805607e77fd910f7b406e8c0d02940 GIT binary patch literal 145592 zcmeHw2~-p3{&sXUgVqf0TO6WQ6h#HC#$}LTT>{hv+)yhJD}h*ppyJ>HWX8ClRihDH zQPkLqwE`xo3kW1)WrswqI4BTYV+|$>LV%Eb;ofuaU;p>^*4q2&cfRwE4`%qyjyw6^oxwuK8i(%QxN2L&fR2)t~Vxjf}XORKBL#B$iZgZEgeVNl|N zA8&>EeD8Qax_UIfS1 zrzMNtyy+8ceHxL|_^MH4&XRcAO5Cz7Px|CE<>j6iu+8)&AjjG?ft4Ef zM#3>SC+9R&4MCONmlB0vI4};@c znXt|3SkJmyn_k!s*Rn))FGMYmw&t|fM&#HeIZcrV(z4CJT)rJ+ zji|PyW!7cow6IvQ^%JUth6lI4e7$3p%~B__T#K`oyeWHfUSh5JE~3<}Xh(#lwlU6} z#fr&%eidoDtK0H)yxxM2nPOH`a z{Bl_$i!3?DC=0d}l~>0!y?Evbi5~pSDXo)nitS(H%gVBC3W>-Zz_C)vW6C5pcl*~3 z4^FeT(e{wbX`+IyOR)MrqQiPO>z(PK8qM0acru%X8SkIXB(b9GTQ8P zzV5?mE#icoPHtUp|9Xx#D;y1O_7#Jz=j``EUp~)i&YdoLb9QL+d84~Fk7JR*j~s3F z7h^4bIL+p=42h@pQEu~G&s32m^GKZec5Qp*i)&CU{8n~bGpEZZB_ zQ%kF-<)Y3QTVH!9Io6hYM&z;0@-X^xcwF?O2t`Y}+AiK-cl4Os`t&?!b^UUMTeh{# z)vout=;XL2x8T^Q7^@?z)y}p!!dkSQV=f!TG1S>IX0^2N<1FaGPIl`Zb9{D5ayQx5 zT*nceGPP{8KFm>QaxBe8j_tRy;2&FB=W&{lug2$Co&+R|THhq+%(S(Pk82J@o_!Z# zZIy9E+su_LTG?gC^BmF6noKwUY_p|LvS>%k@YqJ@gLdE4oV#w9roZ|13uB~vQ)b$N zB8$JZ#C~<(xK&$kTIx8nkY1ORi*gX+*X*ET`qKVHenSGj% zv0^69ZcQ8Z6RVXq>?d38nR=Nm!5j2TlHGFd3HHltBdhi0wb$qzS6hq3)WX@=(hae-JdI$UwXJx`YBfD# zSr3WQE|*q6xl-^5I_@%j}&qUFw5ZgKh zCwo(KnYLm5xNCdyG+FBlK@5rpac{p6#Gz;~_iVYgX?@g2G%%QZxm^2taz@Txr!?7{ z_4P4mRuI=%u6?$?{y@2QZZMa#84a&mA*fmjh9TQZ^1Xbq+ zRSH2>rl2ZUP*o(Tx-F=>FQ|GXsCpr&suNVT2&$l!RiCY_>antlxw2~T$|~2DuUsEx zNgMu4Fa`OjzBu3LdwsKWO_tRD-G;Ow*8;j%xpp!pZv9i^C}Uz9Hne*kkNWd(GvcHL=Ae0v;|HYEFf#<`oF-v(qYZ_JX~ znfox*2l;GD8i-&7yA~J|A2<5G-t63z zCA9?k#H9^+6cPU~vz!3wzdQA<@y$lxe~X!xbFEoYJBxn`_8^m2TYevTo1Om@V9(R$ zpn_Nb9zL;YXR-t4RlA-uCf;fE{cW?eo#^JE|1f@d;M%`GbyBtKhu{_2*yvmOFGy|l z{V|H!CCVn_{^Q&C1R{sw+R=NHqoa~Yn@cP<6P_WrK+5XLc=cbdpoiopk zX^#)sZ(`FP-~Mmj%s;%|m>AO>R1jvrY4~s7oJ9Fp`{;z1E>-^7GJ@Ml^0^b=qw~gu z*Dg=}OJygyK9bW;{3)F`Cp5Uc^skbsxH~1Ev-qB!W4AWnBVvU*Pd33~=1Um*JbJ?l z$a0ai-Xlap9fwUD$aL7paLA|AL!b_FvOPtRLY)_z7|8VA$8gD~_YQ%&$Voayh=sbT zY}z1Z{62L+UHD%{fzj0 z`pgh$h@9+B5j%yt>1^V2ruTkEN__z2((O2 zj;4r1Lfuzv+EAv$0Y-cQ{bmRhA}7aE#1Wxx7MmE#^gh5yDWKmCfrN6BO%cb0y4h^n zFlPJ#Mt%YPX$TZ0CnrKRa7&+-l5y?W`TsF;x>5#y1D5TT* z&{jG5B}JSP>ipP*3)4G+;ZjKN&4+f&$(a-(6YBigwBgM71crAZeJCGFkdwX?@x4$t zk4+3`<|i-&g>*I_N|KXvDB`S8H=j)#!E{Ju#23 zeGwn}Nlq@Ji1R|-LN?8n8K20=FQkX^A*GyLN)Z=?xnH5F@3CewPm!T6(MPvzeL2SZ} znSY3(FQPZ_A&Z=hqlg@#E|^VoXF42aI26FawG0gnK3_&rS9SRLlkb5a2PpDhL zrj2Df9AU&4(`SZ4LlmTxA_|1M5H>NE>3xKeQcPbI3XN2d2PvXRsN=I~Uohj3F!GD( zp`p+?1$mSrN`$&lHt_{B{|G~0OvghZ4+VLGBFcoiFg9%*)8Qz?p@hCY6q>FePg8_e zs1vY>aZK-{43`r6!BA+Hg8YFZZVPoQ*|hP@_@fN(68aCJ&;kYdBSriw)P2h)#xwJe zG6W^`OQFy*1(`|_Gh}$SxhDWXQGi)0fMnchhZmr{D~Fle`eyh#y{gt|3s+9YOt62rTcJ~RwU zP>_Wb@kFRw%O)l<^OG2YQaU>fN>Y%e6!A=`TgRqNW;z^a#Fx@%hCyc()AAn8GoFSUrG-RgOm!gf+A{#I-E^l%>3gFeJLFe zgRUvaDvB@)b(R>SEZ0C(}Ebky1v#8wME^WCKOC2z9Y+8iyI5%*ZdJKMjNG6=X9- zv2Qh>uc6NrKtq&d_X?s@xNa+(_>$>;ijktBFA_i_m1OS<;DvX+ zbS3$D1<@^B7tbc9GrdnUT(tCq0%(?!99lv22-odo(`GQ^Pcyu=^dAJ!0wp=3g6I{l z+r=hkF!N6{1X}tf0klj>j;)=lNzV#` z6|R$9GI75)%SKtWy{&@JM9OWPitDWK8ZZW&06_pZfG7a*2)f}@6eGduuanTtvUXMh z*abWQ5dbrQBmjvB>frrr5f&-MoC-CoRwuztT+A#(En37X0As)j5Cm`ohyoCgpc_7Z zF*caEo6WK*7Oj(2;3!h=;8f(YYHK853^)OT0B!(L0OApJ!zU=lt(^Wfl9^^%H>&{b z0v><}fEhp%fJ6j!@ZPnkr-`Bn&SVt})kzQ&7dFcvi?*E=i~%P=5Wo!}3P3!9ZukVn zIMgibWEE`T9Mws{F5m%(0GI(J0Z2qp2k&2tp=Mb>t6)3lXpIEy0v><}fEhp%fJ6j! z@cy;9*Tm(TWrHo+ZdSd6C~7Nb@^uzkBLQQ;2@nKu1Be0;kDwbqK{0j^MQ!0sRxXuc!k$^Ga1PB7S0Ym|aN6-zQpcv_*C^08P&8pN% zR-3pJ%rd4$%dqOf7;pjv0o(wh0K_BchL2y2z0I1OeOtq5#Ar=!Q>FjO|4A1ZR_qHAN?J zGI1TvGT5Spta>m8oB%-pH-IPr@d&!%;}_#1v#gg@u#K~{Mgn#L4?qOK3?Kdtolx(`mLNz*I83)Bw!3U0fGQ-08s$q5p=^RD8`PW`YoJIYF3s` z5@h1KnPq(}+Rv#;^C;;&Yy5Zv&W0i>;VU|s>Xqi?$LsY+=vniLARU-jo zzzGlpa07?}5Raf6K0z@;qI#0ktYXFLB%UTN%Pe!WXkn`!i~%P=5Wo!}3f?0glWmfH z*pfu&Z#83M+^UG4?4H{W=oi&jep{DxWCCwzkBI8vp3^lOLOWG|W7HN^9l7|Lg$+4z{$x@Q?NsV|;o#HO}9+Z2=f z?AfN+)W&DcF{#F9{W<0JSD%*s9FzKHU3l^f*bx2G=_iWcr?=vp21ipjab7ON{k9;VWWV`-v zm?9r%N}qfX-egMu6}`&3=D05T^PsX_|2<48t(nr=KMDI?eh=t`dG?3O`4gCw?fRb( zx#mTt^wE2xE>rrS(W8-><2vd6a5dZYj}gf*XG-lq;~%0WQ~Ew&UVf6}di9U6G28Wh zVftQb^gZz(QDyXfe+0!e{+20i{C$`MeJrU%;sUzoxbCb@ykYcx814KjQ~Dv}*Z^s^ zt50>}8Kdv5Xy@md()vK3=F}k{FfOQ0d~Ec69qrtdDYXRpSW}0H0;D;vA2KeCcD7sk zb)ZjE>Y11TyWWRaCngwuKV;k-=+l~dCN5xJj_bMV#5+dc-=dxEuK$p6Y{0E-*Ok?Y zN~3Q@w6opP4S_x_sb@Z5+!Pz|x+V2-V_<bAQtvVlGjPr4Smb{6T0X)H zfyc<9ew2E*ftZQ=4aU;@SCgQ|bf*;fwn@W9d?KSpkwB z0xyw6qbT)31MwBEamGwiG^PMig}}?@&=^X6*g(v}{f1)h2hgMfL=yt9ltbew^-%*c z8`liQA`hU~3J_fgyhaX9qSQ$SVh-*%3`;+NJ}5v;A@D{yG=);1Fc5Qb%`nV#0JRh# zG(Jqqp{bPmq=E3m{ai5j1av?l(v=VIltVKp^=Sj)k8518$OP1*5E;ma_sbz4N`1ya z%)|YLW9bR#vO>h24U;2$)Sam`bPt?5Z8>rA`{VTg$R!iUz9^jDD_VUViE4=ilrx_4+@b;K73UU1ybr% z0}+60TrpE3YAHkrKCG5Q%PDobfmn?Djl|p!q63PMeSEk;4)H0q+(0bBH6yXegQ!Ol za*_{g<tuzozalcVm`ayJA5t7b_DLE8QsV^CbuW`*N%ybZqDMD0yxJC}Gq10Cl z#4_A(H0FK?O)5e(eE7K>T2HAn3`8KV8I46ALa!AeIzIeL4sE2=*9=4u?&pT3A3`4# zAtpZDB!^-tb+&;B#x-u3=@4ouLTI6II|W2iYL$WD;ePIz`(boIG14^@?xcXWQR?dk zVmYpH$084-9>vJOP`H}{+DWNz7>I9hzcE<)VRTtB;vNe3Q$Twt^-Tk@0@sYeOo!2! zV#F&H9;ATwQ|f#J5rX@T#oUjeNyUg?C_G#NB~t1_1Hs2NW3k91=(S>m7YdJ2Ku0Kb zv4IH1{l37`kDw2Vk;qVZk^(wTsY?w+7_RvOGaW%K#Rw4!PgOvtD7D5w2ynk~nEO$5 zKnb!h6!uX--&5*a24W?y8HYt4MLkN8lcBJ`0y;;j?-+=0ali3c`cZUQ36dTPFHt}j zDD_u}8^%#?)2lp&15X{IC`xV;f28$6%a+K4F&?o{V**3IQpOzi423UDxgYA{n9{0;~ESz z9Y-yt2oVOW6;KVOHW`QwxSt2+egYj(hU^Q23lz{3O8weEY{WGlSmX)RqYOD225S}2 zb4p!rAU5HCQ?T?C=&~{-Jq)H4P%WiyFc6z@%@oXZ0*xs{RAF$90(wQM%?2U{_w&Tu zlhLFyL=y%-S3qwlb+dtp#WkK-WHNfK4AF(buM|)drM4J|INXner6;2g$`Df++@ye7 zDYex=h;R)DGbN*zGK408+bN-T6>3^7LEwH~nEOd|fClL*fIBInjuqxt7?5Yre!HPodW|2u}cyQ9}JH)Lm+c?YQ4G zEd3PvK!ZdI;7LjdtxzMi#133D4KtlWEgFOnz*CjbpbB-@S|T3zn~u4kMh9q-eFE4= z2{~7&yVnvsam{or@-*t9MNSG}e$`YxiV?VQQEtm8G3QWH1KEc?Qu1!KSo5Cm`ohyoCgpc_7ZF$U@+ zqfOjCX4z*JZAYuVy(o(0WT;qR3^)OT0B!(L0OApJ!zU=lURHf)QPeh0#&uR;jU?5? z4KT}GEm|-JoB%-pH-IPr@d&!%;}>J4PO{p>onV$REn0?EPZvdrIT>me7z0j#Ab=Y{ z6o7aH-S7#D5w+?OQPd7jMlP$eM)K0cjW)|Lix!LlCqNLu4Im0YJc4fc_{BIyCvh@y z9nCV>qJ^ybcA|QMvq{AQW55Xz1aJe00uYa&8$LlX_OR+d!AE|Bhun0XHKj&!!o;0x zmJI_RI}Zc_1OeOtq5#xU{Z@`W3bJ&PppXBN-{2u-eJt9~ton|k`YoJIYH%5V27w@e z8$c9*I&w3&bpz9?{{$cT4IXk+E-R}>Qf1;sm}L{dWdMQzf&gv+Q2^?wemln=1+hAb zr-{ol%N#9Q*s6y_@9`P%;A}t@(1{9o2LuO5O;8z}=Kl*((8sF(OjN&((|ny3TO-Lf zaf8h=H;WdG0VhBZzzrY@KsKq7)Vc>h|wVB*@}LcOy{d7TAz0S`a~zziS> zKq7)Vc>h`qH*xJBfRwCNqL5=dyzq)ghZw|WFZe_yE{=+Ul zjM=+5@4@D$jC*@}L{ta&oUYjr+Nt{VxApT9`?)5AECogK2Sp+>aRL4xV!*}{)pKku zwuUrYt0>2kciy(KUUad(MV;qV`X&L%II#D(cLSfdsIgEtc>ne8Qr@wx=&?v-^%EI zmC^kxqnVY_11h7@%4ny`XjWzPz{==BmC>J9Mh~ux9#R?Y+)gw$+qF}5;#Q;Y^=Rjs zOsOf*$DBGOCZPMD9Y4=;ef}!>*J$U~{|0iSo$Y|Ch?sz}e;siFWB-navCYxWkNz5N zM?3!$Jv>XBQ$zj=tf?Vycrv?#mMT!|BVe3Uk4U^7@7kM{uR5z;;R#X`tuN0 zC;oeExMK}0X!w(`-{tqPmpQyT(eP(5pgQqC;mVaafd#ML8%==){~0@5_EaY(y&slU zC;l<6&@F)l_Mh<&(HdCrKG<{rb#>x{KY~Yf;`_opuOQmF>_5U7?fm|5%ie5%t}VX{ zA4}?xxPb0Ct~;v}Zy0?aMmxXCl$rxSWGu~g^{GxgWAwch?fg7bS|8}soH`^n;6uib zjlQp=otrYHmOvkC>JU+YG{?1|I`KosPco&i1AUrO&%^}G%XYQvJ;CT(814Kaq*{&SMcZMLDibb~#qt7mN#d-IyuOu|L*dIdnXd`+V<1^a<8^LxRcWq5nK6GL};uHdRm5UuH za;t&&CGIr{OWB7m&PPUvzw*c820(;BFLnu;e;Q8RH zA(%jlPAou9gus4su?s~e7m8O?_e%f+)O@&^NN zKCT*$=@ZZmg@`8~J}DRbQDlmNw*dDVfw?52hYOK8d^kleUO08dr_N^as%mMMyRu*2%?@6nVwKTZVg$##|1ehl`L>KCG9EqbM@N zzzf7xqcOoD^hyy@#fMFD@dk>#X5a*A@p7m@{$jm<>DBM%r@|Xag`gUKZKf# z5Gx<1DZ~Utsti0H?&XfT97g*VBSg~IL%@nMQAHt<4muP?BaBj~+iWOXP!Q6WyE z$Wj9@3|D=D>5ri1Vk9mU_ELyXQl!Sf6X0IsFqflf-x6eRDD15epP|TG2Hr|sH4YOT zMJJXZCqiLAg*b&G?-+RB;$Gvil%we45+pSgUaS!RM3Hw5yj8erJf=U2ZYV*rLt&mm zoKBJV3_Kz3#l~EYp@&P5(ok5S5GyIN!oUm1RcuUf482l4ZJnDY9b~`LMN6YPGRsqg*cxg9~*dUaj!{ON)o!b6d4@`A6AHqDe|d-w+>fL z!t_b#hEl{c3_ht4Yba80;6>qHlQEa$=;2aiP8gh`5Z|H5-weFDgH;N#jv`G4-Ui&u z19Lfn_ANv9hQav?@ned7ZQyOhRUVk&1Uj({IS~eH6ky0@z(C?pr~2spW0Qy{2I)r_g&EWVHaEs1y&VAdy<$ z4qP=2)1N}k8YE5tdnv^OE6A?3ym;JeI_7d3?W;xh3Se)gct{1=y_UBVS53zRr_qU8 zMBBcUYpcId*Ap6(y_TZ|Sm_UYJ(IQm>I8rH|SV0b`&6%d^MItkq@YX^1#4?qOK3?KjGqva_ zQtseX9+X0vRHMeAf0fHB|%2m-hPL;;9L&1OeOtq5#Ar=!Q>Fj9o-g z+c}eSS;uQ6r6z8eS!RDPy?$0b7z0j#Ab=Y{6o7aH-SF{?akPos$1JnIDPKpczP%`l zIu#! z6>Ex40>*$7APC?F5CtF}K{tGYV(cWU-^$r^oi(LKa>B%&YnBbOXnR=oU<^0`f&gv+ zQ2^o*bi>Cl#vl{d%`EF<(SBytcNEoc;cQZ~vUCzK2Alvv05^ar0PzUA;S&@iLsY+= zvniLARU@e~aU;yK2^KBWst04h2@nKu1Be0;kDwbqeldEQxGb~G(V~T|dPr1Ha++1F zSe*on0VhBZzzrY@Ks#ZWe7Hs~(I2CqNLu4Im0Y zJc4fc_{BKWEbC?!Y~}Q?k$_#m0}uf)14sgph@cMMzZQp@Wu2^oEu5n|3D^ZZ01*H) zfFuBk2t_{g=Nzq(fL*`?5CJd)NCJ?Epbp-@7JHjz9jyYAvs5PmyMPBE z0$>J^1RxPX9lU=nE;7q{Sq0lTOKT)x7w`Z?0L%cA03;%)gZHmRwpqro3dEcWodoOx z9)Jjd89);J=R~|@^Up^Om)1aQ`sOqa@4)f8bJ}H-Kh(3+?g15(1@mHTFP5IZur1(p z`so#C=2rh&xVM(}OZ1~IlOELY$~dpM-9$aXU;n>yFz%sbrbQdi>Hms5*ebZe+GGFU zx*{fWJNf?vNW)MM~QZM{kIbS)dGW6xclCrbZorazs!L8?%Ex8Xj z>F-A87$*o@7CjwZK0ny_+vC1v?)t;rz&-1}IM$qQyEdxjyc^#me3rs?$M$vU7t5k^SH5`^)zo@% zS;M1?u}QwRjOxJTyp1m{mh_^g84`|vrO>mOx_tggUGx2_N7P2+)zv@8#NPh4$uBRn zDQ9y_uE_5zs6$U0jpjhR9zV*zU42o*)%G-6NiQ0WK|^U9gl_AiHVXOcMsElg`uKGH z+X4I8w6>GlwuK8i(%QxN2L;zIE?9lvy=&GpSBEO54}Ocjt#;u0K_?G6^@sI|2VHi$ z&*(hl_`Rm)wc0O#@$q+CfBVL*ZC^b0DDf!!azj+sh~ZcAzU*Fl(|xkzAl1m4;me!) zR+T(-3@~k4%a(pS`&Br3v3&(mFlJ=JkDf3&tMjtYHrzNag24vlz3tW}F%lwmN$6kRQ&#BUzP;9zXJN&Tr3o72Y#S zJAjiu{B+3Z{M8p{Y|iU_{F|29!k0~FFJ4WI`q|qheAO%Yg&7yZwIj~->^<`CWWThq z7o8h(?;O5R!aDk_{RNr&iIanLzV!Ojq%lQj=U#27%eU-p?ZG_KdjqTGySO(w%}Xtv zb6s1Virp@+-N=6S`L73lC{QjxuyT&$ye(@>yJnrAb@S500IO>E>DB?i9BGda{Pp>> zs}-(_=fmon_x8WNsQVB%yrcZmg_I3H58ivpQ1My7u0vS+NsqS2=IO2VKb}5OUN-6C z5!mf^rnBa|`qew@#%6upK5OkJ$Hc6(JyoH#&D<@+v&Ne_ic34E&+f5=ubQQdIQM<^ zxZ|6icm0+eRdnSi$DfnAp&17c5BH0l>NI{=zoU~v7Z2=QQoDHnjnbeOLpwOOU--qf zdA;ZL-je>y?z|fXz7ZB(=i!@WcROF7SG>R`_3M-x`ORKh;en2GW)C?z@SJDGvGVi9 zuXK4;(wbM1PhJr}?n;d~dUB+EVeG|OQEQ7^18-+x&s*e4E4tl(aqZXDKBE`&ZDINpdPf|{n98kGogH1VCu94MjZ>@A2S;q6y*_cSqQ~a5KUSXp7Cw6e zi+h-rcH&t{#dnv-t*Yc}svz#v#yrDgL!WmIa6a$VYh|75=f)eIz6{?sK-PKd;VKu%yzV|}uqkYLLIDGc(A5RaN)OTefJ8*VG3EuGKB99fUs>vq* zY58kZTaVU{$#DLDYJ>YOzmr10l^0kurt7h9?=Sl5-r|h|)YB)s6%FhB%wZ;Z^y=3G zuMQnO_f^iR!ooXl1CD-|>v7`Aq|NJBYvxV&_%51W67x!G~vjEWR2w}!)Nbu*r8z5_v7sxEw*Pwx3@W55wVv44-(rBwry=Ewr&3; zahr7Z++6oAUdGm53txsy@%~-cA2(~}%=+@Q!;MjAs(NeB_)E35)wl6Lir1Zczs&7Y zqA+{@LUYHv1xw4i?&;Kd>US9lo2E>2`{nbDnROodTbG}{WC~dY-Tf+Z`TetKkI?Px zD(3c!J(zwEei?P@{=*+H?P_5wR|&6}AFon%8Z`eWRh@M6UTk^D%)$K=zVDkDy6Sw8 zU*|5pTr^e7`_H%Jj(FZkAB_+AZkQ52|6sYYuNRKS=BE zQ|nRQ-p^_4^61mMupD8;WvO3PZCxLjohzzCrxahmvk$pHj9Q+!;`#V2kxOrvx!zxX zzP5)}c`{)4tbRwXg_$qwibsr$v`G@?43-_=Xgl1twVm3w{qqtWFI9II zyLauN$qeqcw)~!xZ#P+==U3tTnK$;(j|%fsZ&_pKcWxz|b}VY1PfIHXe)(P?m4))*TzTA10N{j;xUNJkrZDePQaf)gy;;*6dyBFSzi9 z`$@{9!=k(l&*6%0GPg&P1HoxjQ}EiEbsM>juX-uYW<2~~Ppn(lg`?8#f*A|ZXpVoc zr|5{atGMQVlbtxorbHqdr0 z?k7oP26tbz7Zrw4dC!tYe(kzXR}gKhYc0*rtbct@`?yN7nhOdM+9dEdG$@wQwSP(P zq_ic26HX0Y{>ZvxdC|OHk^Jvc+x3_k4~=T?dAIz>H&NK&A)^wvx4imn`e&@v?>i6t zBIES*`%ZH@l>eMO`Frh>6K)gv5U)A#Wqi+e($BIB^*wi!n>%Jnsre` z&OBAKnm<+@bbEfM@5c_zS>A91lb$%&GA#UPld8(NK+|>eLWkH13u~fUUIv8a?zm_b zoHfMPJK`@BI<-iybQDd^X^o4md+J!R(>;z}*LlEK9@$HGMru2L)v5G$&6(|?9`}>O z!_sp*J#)L&OFuBZDyinlO_{Y)7(wx?-zN6nI#C_YnZx-2~W>bg1 zd;IHZ5v!y4tD}M!Y>ecu3;c&2+77pEZKt+v|HDMW?A3NAwlyYQe|^cfOW=ZqiK^4e zqTc7~X*Z8_{mfRt?z+0#r~SgOcha^c@=LBYPT4#%?7&i2c{|pb@srT+r}?TJzV=oW zKYwN!zwyk0R|Ah32XxqyHT1D^mv+jS-qSlC-En8K`{Lmj$~_+5bvyFtn_mv8Uhc?+ zhyJva_f2=E<7B6<(%GjTuj*Cs)t*G8c4|l86PZ=?L-SuINw;u+QtTOSC8Se^%;4Ye zG2;1klxOUJ(R(Y%Jx zs(RnK!)CVLsT=k5{ufni9t8FF3Vo0_AyvD7d1LX{eGV_)Ay{9L+&E6D@ENdai==y8 z>G#PIQ5>gbXY9Q%!6=pwH*p4p2=-Z;J`a(qjp%rI+i?&Z5_OK0^}UCNy0oq1}dhnM#Q&bK|dJM#+fA1LaO*tc?d z-Vlz+D*XPz9K2_8-*4uoN?%;t*Z%m>+nJZ7#=P=h6%Xz%*{Jegv+G7`qyL%yeO#$A zEq#a-OgZA|W9|2cwr^ROwD(lUwEB}vx6bzWm})NBw|?l2F0KtfNS8-AeLpd7*C=0ib=4^gQfajUtR8wwt2skw(^~|8wgQ;#uJT5vf`+3uq%HNtby#0y( zKY7hpbv&Q2II`lwy7?2wOcp;Cxjt##a;N#kyt*5bvT@gsTsKV}w=Bx{aI1E53*GOl zcI|sY|MN>oOn%!Nzo?j>6^P|?e{q1Hnw76d!2vQ{qL^yZlk`vlAHVA$ayGt-5 slfP(B`!`wlyDPox!M9hc8rS}9N4~W}M|zvkI@$k7>=y08Zu9B?0aazy0RR91 literal 0 HcmV?d00001 diff --git a/tests/test.rs b/tests/test.rs index 6ab3b2a7..f3d5c7bf 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -535,7 +535,6 @@ fn formula_vals_xlsb() { ); } - #[test] fn float_vals_xlsb() { setup(); @@ -667,3 +666,12 @@ fn skip_phonetic_text() { Some(&String("課きく 毛こ".to_string())) ); } + +#[test] +fn issue_174() { + setup(); + + let path = format!("{}/tests/issue_174.xlsx", env!("CARGO_MANIFEST_DIR")); + let mut xls: Xlsx<_> = open_workbook(&path).unwrap(); + xls.worksheet_range_at(0).unwrap().unwrap(); +}