From f6bfd71bc32ddf3d52cd9048031268012669af6d Mon Sep 17 00:00:00 2001 From: Todd Hanson Date: Tue, 27 Oct 2020 12:42:21 -0500 Subject: [PATCH 1/2] Add support for implicit cell coordinates --- lib/roo/excelx/sheet_doc.rb | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/roo/excelx/sheet_doc.rb b/lib/roo/excelx/sheet_doc.rb index adbb77a8..7a09725a 100755 --- a/lib/roo/excelx/sheet_doc.rb +++ b/lib/roo/excelx/sheet_doc.rb @@ -211,10 +211,19 @@ def extract_cells(relationships) extracted_cells = {} empty_cell = @options[:empty_cell] - doc.xpath('/worksheet/sheetData/row/c').each do |cell_xml| - coordinate = ::Roo::Utils.extract_coordinate(cell_xml["r"]) - cell = cell_from_xml(cell_xml, hyperlinks(relationships)[coordinate], coordinate, empty_cell) - extracted_cells[coordinate] = cell if cell + doc.xpath('/worksheet/sheetData/row').each.with_index(1) do |row_xml, ycoord| + row_xml.xpath('c').each.with_index(1) do |cell_xml, xcoord| + r = cell_xml['r'] + coordinate = + if r.nil? + ::Roo::Excelx::Coordinate.new(ycoord, xcoord) + else + ::Roo::Utils.extract_coordinate(r) + end + + cell = cell_from_xml(cell_xml, hyperlinks(relationships)[coordinate], coordinate, empty_cell) + extracted_cells[coordinate] = cell if cell + end end expand_merged_ranges(extracted_cells) if @options[:expand_merged_ranges] From 5eb8a8aca4a002c972ae2d941ece3eb06ceb7026 Mon Sep 17 00:00:00 2001 From: Todd Hanson Date: Tue, 27 Oct 2020 17:11:53 -0500 Subject: [PATCH 2/2] Add test for implicit cell coordinates --- test/files/implicit_coordinates.xlsx | Bin 0 -> 4405 bytes test/roo/test_excelx.rb | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 test/files/implicit_coordinates.xlsx diff --git a/test/files/implicit_coordinates.xlsx b/test/files/implicit_coordinates.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..039d0187a95bb38b45ee46be69f0ab2c94c5ddad GIT binary patch literal 4405 zcmb7IXHZjX*F6|o2)#GyRaz*5G`WIw=^dnqBB5jGEpRC!ND(9m8bG?V3n-}cj?%6a z0|E*n0i_u!(#sq4z6uw=&w1y}WKMoOYu4!WA0rqXzK2HB>MhLyP2Ejn2yOrk3dp(N;}(-NJ1{*{Naa$M5la zgiS5@|GqFC6y_q5P@vt!mwU@KC|IPd>0Ftej}H%ri8uYLIw~xEEvFlvxE|xPyQh+6 z{ic$HT{*n^_)3u;@0K|8cKBLf%0AhsZUbiZ$Ytagan zWV9Oy0sES|7Plfgt8#F_7$9HdxFo^!W-s&L^4eKHj?9R*4aH3|R`^EWpPMz3!_%+c zzu!;^{>VO1q{`)aVcmAmhN|dbk@qSSI7zV9T z!g4z!G{?&YyHYHjLMC?PS%rsLA4umVZ!!_f69L8ZLX2tC87USN7^oR%vY3*!26>Hw zkr?+pRZ#MHZDZ1$JZKD3aE_T^4kpdS3!>vqwP^$l>T!fj`Q$Of;&dAJ+FL!v-dS3*p**Sez6Ukj_tWb+pOi+5 zBbdvW18zW;qV`&-2xS*}VI946 zg(Bvnp@ITWB7;n!S|AbB6o#yT(MnJlXKQCa1@EkdRt4wf1YKBl}oT_ZvS3s-b=DIW%zyjiHTd0d;UuCg>$aVJIiO7cMQDcmzCnm z`4GMj9HgFmXV^F@Y1)$e=r&aqdJOcxSOL(pmr4}BT3X3!;Wf-3oPJ`b-@d}|(}CIl zav=Fn6M4ZL9K8SOcDCP{@el_YUvk|GXGDHt0AM_U^9@e?hbs>e*-zddeI}D0bwl|9>?~kkKj46wtpsBjHlP5r;061PHDiDPbNJ^ND0Nd=|S#Xtmnp_ zNBC`sha5QOk5ZKy!BT^z)8T}C>P5X*x|EiNl^SPy1Fq!t!|b}UnwK|5OV%RS2arIf z0Wh6fzt-5OMSbs{K3JxOnKXc;3i+j~D!Ls_9~l>YCZo4-=yo1;_ZR6_|V z<(aCb%5+MoSGf{1@}vZdN&PzW!oCo?*@ok}C2Mj4(w|XznJ1(v9^vb2qQ-n7p12SO9}w6O>TGqk~2|iPpJL zu-fQTisFZ>(5Od4`Z@m5f4GY%n`MZ5^1TdGNqbosUTi_@qNt=wh~{XEc=(XX9Qc;5_~uO097etc@bxZ+FX|{RL!Rx zqwaRm<<#C-*vcq5N{>eGR-0Vc+&y4j;Nt;B%E)TDIKprB)xq^u=l!yA{@g&cDN|EX zZgWMlT58G-#^pBXgqR4AcZzhkx8t7s%cIB%3 z{%)9$hFdlT=~ebTF|sjjBqd+ioUA~ zt|0uwK#CkseL6#)1nl}{@TsIxRuZgEauFJu?=~i0c~v=hEm+TTT`zcjUhMeDUP*o2 z6OS9$K2!ie_PvR{yaQYvynb}wXqS{;8la`d*$|rqL1>h*1c{bC$^P?M>%;{+ttLg`rOYzkcjadpXr0VLNYR1>k zI6g*Ajd$!$GpTh_r_=n!lQDIZIXDTS5$ATUp-7;bm^Lqcs(WnPh%&7-Cp?YY#0YFl zl21@cIWGaNF5r<#;PHoo+nhLv@1E1a81_b;6)@6vYEh%$oDA;4Lv=C+)CeIXkmbgP zI_Jm-c|PF}=IO(8X|7V_#RRA&Mn-6S8sw#V{o>yJfT(cdP8JGX);lH_S<*5Jt0Vl2 zPUE*VWIu}+qM5E28^RCb&~dgGLBq-M=C^Mb+_cm-4;CAm-Q%r$ofpH$4^kd)e!ijg zv10TlWQj9H((sJtrki3L!PLzUY}+}R80Jefx)4a~eI(MQtQf>^Uq;<;;q|uPrUu*m zg=uEDbLnlJz2pw%MYE1|-Mel8QELFU)}{!eVZD0&FVrox_84B)cnXzwmxUlfNRodU zGC$po!Uj?Zw&2gva#|-HbjRy)&#m)vwwUEmvW*kA9%b*QE;77G|_!2k# zx%YW#ipjJuXW~7KH?e}9x}=`wO&EiwnB|kza~7iZt#{ulIShzEGQOdqkh%d@)jEM2v%eBxd3DSd6cQ*5B0iU0Uw$M|h` zz~xgQ@6W^6U#@us-`Bi-k22Hv4s_IRCdR*KcQW4{WfzZIzj5pi zL4Tw@9Ohv*`+ta@%z8(OqEBERO@6;eKm0s!d``{?U%A;^c<@$}I2nY{5gar2-N