From e728ff14981bda19a18a830e416290cecc5a269e Mon Sep 17 00:00:00 2001 From: xuri Date: Sat, 15 Dec 2018 00:08:55 +0800 Subject: [PATCH] Fixes #308, refactor `NewSheet()`, `DeleteSheet()`, `SetActiveSheet()` and `GetActiveSheetIndex()` --- col.go | 3 +- date.go | 13 ++++--- logo.png | Bin 5207 -> 7085 bytes sheet.go | 95 +++++++++++++++++++++++------------------------- test/Book1.xlsx | Bin 23099 -> 23153 bytes xmlWorkbook.go | 2 +- 6 files changed, 55 insertions(+), 58 deletions(-) diff --git a/col.go b/col.go index 8401a992..05405bd1 100644 --- a/col.go +++ b/col.go @@ -337,7 +337,8 @@ func (f *File) RemoveCol(sheet, column string) { f.adjustHelper(sheet, col, -1, -1) } -// completeCol; Completion column element tags of XML in a sheet. +// completeCol provieds function to completion column element tags of XML in a +// sheet. func completeCol(xlsx *xlsxWorksheet, row, cell int) { buffer := bytes.Buffer{} for r := range xlsx.SheetData.Row { diff --git a/date.go b/date.go index f52ec594..a0b8cebe 100644 --- a/date.go +++ b/date.go @@ -90,12 +90,13 @@ func julianDateToGregorianTime(part1, part2 float64) time.Time { return time.Date(year, time.Month(month), day, hours, minutes, seconds, nanoseconds, time.UTC) } -// doTheFliegelAndVanFlandernAlgorithm; By this point generations of programmers have repeated the algorithm sent -// to the editor of "Communications of the ACM" in 1968 (published in CACM, -// volume 11, number 10, October 1968, p.657). None of those programmers seems -// to have found it necessary to explain the constants or variable names set -// out by Henry F. Fliegel and Thomas C. Van Flandern. Maybe one day I'll buy -// that jounal and expand an explanation here - that day is not today. +// doTheFliegelAndVanFlandernAlgorithm; By this point generations of +// programmers have repeated the algorithm sent to the editor of +// "Communications of the ACM" in 1968 (published in CACM, volume 11, number +// 10, October 1968, p.657). None of those programmers seems to have found it +// necessary to explain the constants or variable names set out by Henry F. +// Fliegel and Thomas C. Van Flandern. Maybe one day I'll buy that jounal and +// expand an explanation here - that day is not today. func doTheFliegelAndVanFlandernAlgorithm(jd int) (day, month, year int) { l := jd + 68569 n := (4 * l) / 146097 diff --git a/logo.png b/logo.png index df9059d18ad8a44e31eb72653af98547a6258ad5..32235b8aeb985020036bb3f29e1aa9a3a4c39aa5 100644 GIT binary patch literal 7085 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 z sheetID { + sheetID = v.SheetID + } + } + sheetID++ // Update docProps/app.xml f.setAppXML() // Update [Content_Types].xml - f.setContentTypes(f.SheetCount) + f.setContentTypes(sheetID) // Create new sheet /xl/worksheets/sheet%d.xml - f.setSheet(f.SheetCount, name) + f.setSheet(sheetID, name) // Update xl/_rels/workbook.xml.rels - rID := f.addXlsxWorkbookRels(f.SheetCount) + rID := f.addXlsxWorkbookRels(sheetID) // Update xl/workbook.xml - f.setWorkbook(name, rID) - return f.SheetCount + f.setWorkbook(name, sheetID, rID) + return sheetID } // contentTypesReader provides a function to get the pointer to the @@ -118,7 +127,8 @@ func trimCell(column []xlsxC) []xlsxC { return col[0:i] } -// setContentTypes; Read and update property of contents type of XLSX. +// setContentTypes provides a function to read and update property of contents +// type of XLSX. func (f *File) setContentTypes(index int) { content := f.contentTypesReader() content.Overrides = append(content.Overrides, xlsxOverride{ @@ -127,7 +137,7 @@ func (f *File) setContentTypes(index int) { }) } -// setSheet; Update sheet property by given index. +// setSheet provides a function to update sheet property by given index. func (f *File) setSheet(index int, name string) { var xlsx xlsxWorksheet xlsx.Dimension.Ref = "A1" @@ -141,19 +151,11 @@ func (f *File) setSheet(index int, name string) { // setWorkbook update workbook property of XLSX. Maximum 31 characters are // allowed in sheet title. -func (f *File) setWorkbook(name string, rid int) { +func (f *File) setWorkbook(name string, sheetID, rid int) { content := f.workbookReader() - rID := 0 - for _, v := range content.Sheets.Sheet { - t, _ := strconv.Atoi(v.SheetID) - if t > rID { - rID = t - } - } - rID++ content.Sheets.Sheet = append(content.Sheets.Sheet, xlsxSheet{ Name: trimSheetName(name), - SheetID: strconv.Itoa(rID), + SheetID: sheetID, ID: "rId" + strconv.Itoa(rid), }) } @@ -209,13 +211,13 @@ func (f *File) setAppXML() { f.saveFileList("docProps/app.xml", []byte(templateDocpropsApp)) } -// replaceRelationshipsNameSpaceBytes; Some tools that read XLSX files have very strict requirements about the -// structure of the input XML. In particular both Numbers on the Mac and SAS -// dislike inline XML namespace declarations, or namespace prefixes that don't -// match the ones that Excel itself uses. This is a problem because the Go XML -// library doesn't multiple namespace declarations in a single element of a -// document. This function is a horrible hack to fix that after the XML -// marshalling is completed. +// replaceRelationshipsNameSpaceBytes; Some tools that read XLSX files have +// very strict requirements about the structure of the input XML. In +// particular both Numbers on the Mac and SAS dislike inline XML namespace +// declarations, or namespace prefixes that don't match the ones that Excel +// itself uses. This is a problem because the Go XML library doesn't multiple +// namespace declarations in a single element of a document. This function is +// a horrible hack to fix that after the XML marshalling is completed. func replaceRelationshipsNameSpaceBytes(workbookMarshal []byte) []byte { oldXmlns := []byte(``) newXmlns := []byte(``) @@ -230,18 +232,23 @@ func (f *File) SetActiveSheet(index int) { if index < 1 { index = 1 } - index-- - content := f.workbookReader() - if len(content.BookViews.WorkBookView) > 0 { - content.BookViews.WorkBookView[0].ActiveTab = index - } else { - content.BookViews.WorkBookView = append(content.BookViews.WorkBookView, xlsxWorkBookView{ - ActiveTab: index, - }) + wb := f.workbookReader() + for activeTab, sheet := range wb.Sheets.Sheet { + if sheet.SheetID == index { + if len(wb.BookViews.WorkBookView) > 0 { + wb.BookViews.WorkBookView[0].ActiveTab = activeTab + } else { + wb.BookViews.WorkBookView = append(wb.BookViews.WorkBookView, xlsxWorkBookView{ + ActiveTab: activeTab, + }) + } + } } - index++ for idx, name := range f.GetSheetMap() { xlsx := f.workSheetReader(name) + if len(xlsx.SheetViews.SheetView) > 0 { + xlsx.SheetViews.SheetView[0].TabSelected = false + } if index == idx { if len(xlsx.SheetViews.SheetView) > 0 { xlsx.SheetViews.SheetView[0].TabSelected = true @@ -250,10 +257,6 @@ func (f *File) SetActiveSheet(index int) { TabSelected: true, }) } - } else { - if len(xlsx.SheetViews.SheetView) > 0 { - xlsx.SheetViews.SheetView[0].TabSelected = false - } } } } @@ -261,21 +264,13 @@ func (f *File) SetActiveSheet(index int) { // GetActiveSheetIndex provides a function to get active sheet index of the // XLSX. If not found the active sheet will be return integer 0. func (f *File) GetActiveSheetIndex() int { - buffer := bytes.Buffer{} - content := f.workbookReader() - for _, v := range content.Sheets.Sheet { - xlsx := xlsxWorksheet{} - buffer.WriteString("xl/worksheets/sheet") - buffer.WriteString(strings.TrimPrefix(v.ID, "rId")) - buffer.WriteString(".xml") - _ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(buffer.String())), &xlsx) + for idx, name := range f.GetSheetMap() { + xlsx := f.workSheetReader(name) for _, sheetView := range xlsx.SheetViews.SheetView { if sheetView.TabSelected { - ID, _ := strconv.Atoi(strings.TrimPrefix(v.ID, "rId")) - return ID + return idx } } - buffer.Reset() } return 0 } @@ -404,8 +399,8 @@ func (f *File) DeleteSheet(name string) { for k, v := range content.Sheets.Sheet { if v.Name == trimSheetName(name) && len(content.Sheets.Sheet) > 1 { content.Sheets.Sheet = append(content.Sheets.Sheet[:k], content.Sheets.Sheet[k+1:]...) - sheet := "xl/worksheets/sheet" + strings.TrimPrefix(v.ID, "rId") + ".xml" - rels := "xl/worksheets/_rels/sheet" + strings.TrimPrefix(v.ID, "rId") + ".xml.rels" + sheet := "xl/worksheets/sheet" + strconv.Itoa(v.SheetID) + ".xml" + rels := "xl/worksheets/_rels/sheet" + strconv.Itoa(v.SheetID) + ".xml.rels" target := f.deleteSheetFromWorkbookRels(v.ID) f.deleteSheetFromContentTypes(target) delete(f.sheetMap, name) diff --git a/test/Book1.xlsx b/test/Book1.xlsx index 84c43d15f284fcd570060fecc9c55cea5c1a9852..2ef11210d6cfb5bda5194c91342ae2f750efbe7d 100644 GIT binary patch literal 23153 zcmd?QW0WNe);5?~Y1_8#%u3s~D{Z^dwr$(CDs9`gtuOEGp4I*K^gFZW_nfujM4S^( z{Mml?-XSLm1PlrA*XO54o7CSI|NMgZJ{#H?$l2T2I?%~|!;ruK0RKJ+03c!%*#iIp z09b(l0O0=}rf+LY>uP108P9LCMh_i$1@wvsy@ADX!U^qLktfD=Km7|Z&e=q!$RM}Q zFr*^(d`Y${_K!6jkTcN>ZWfPRT-yp8?HPR>Oc(r}IxXWpX~NACZ`ui&mG6fan}sqg@1jh>=l_U+cOFd5*#1?6o=9Z zIcI}^)C)Yu*SMwzU7PM$sv?PcRSl_DB4VU)!=!xa<*K?+?Ub`8FA{P4A^w1DXR$)? zQLzaBqWk9x`q!V9lb1t-uF?i{Nu&_Cp(=qnKiT%g;?tQ|Rd?&=9a!|}^eotgqM#6? zwv2o)+>+n`Z0#%Eg>4r#T<+|^&%h4oExxI0lNaSIDvmS?H?Qm0|InC|SdF&ex5hkv z001ETyT%M`?2Z0XSzw&JWIsLp&=yFy;D|?hK|F`xn(t^9Hl#CoSKxjdNO}SBjP=%L z)mmFA5?=q8OZPfXvh-406i=_4k#v-)fE=)hTIo2WXt+J9tlT~jTintjUli;1OhZe@ zuuy-1)Ahb35H0z&ya{7gD5+>UJZ4ZW8rAeV8IFEiO`Xi$H1`G~n^wmi$#y~v!y z%aqt0yR@Xhis|_9L+A}Y`D<5qw&V@SUq15RUFq9R09-BqR>^+{{PpiQz`#`B-tj-3 z4X5{<=pFuhfJiDg;QN1yh8`CD(~Z zNK6Vn%A4sBUD4>ac?o6#4FE6Hb-qBLY1f8CbU_{3P;3Y_}dP z@bv4mF*9P2B#55Ch*Zet^pVRvoc#O;aO}xjSd^WH1wUi1Kn}%B3zyR92O=iy94+)r z8LHLNof?25>~I8)b4ra1{NW|JR`%krYH=?U@&%x@Ua9ELxkQJ zGWN-JA~AC(ARZFx=tzn}S_N=XMi(hjdWI%;4I&E6xJdsxZoZDEw}X>0f$sA!i-QG# zdYN&$B$*Vgdadt?Yk@sPi0Q@9Sd0%%5>YcNpJf6{$lQM{ZXhKcnP_yJ7uDmw>B(wk z@zGcdiyb3)lOmOHmmIe=7OirCiuqxp*Q_Uu&Z2(WDpG_PF$jvn#h}keDwSkA*xYrX zFYHXR8@C9@Jym{AUDqtG&{|KLpOj#~sG`Rh!sVVC4=m9){6VpYQzU5zY(ovNMJr@( zK%kIVgb2@7flv68HHv{gRmhTrpiV7swYdaEre%6JGgS*-ggJD{kHSPCTilOrmljpH zZ96b)zSk}Iz@9LrWNxkcSM0J+-c5g+5`h8X68UTHIJ}!6B9p{mJqQ8k^UlHw)mBQn z(isx;v&Psx@MxHhVzLF85=QP~(M{sE5|r8F){5ZKDi0<{iF}wj)viV7*s&W!Hq&h9 za;l{)2x1iBu+f$<7vb*Ap9;h|DF8=8lkn%w)Ovx)m5-RBV46 z+@bCI?d6X{yK^s8Y>zG6sAPwtReb)t!U=I4BD?*=*vnuQyEu&(-NS`8L>}*;q`eJ| zwrKOxfc(RR?A@*D`by5*-@Hmyq7%8NgE zt^`ts9!8rwZXK!(pOaHLE~yIIxXsKSzfIvzKA^aXJ@y;F7MT6E-ve8^i7C#XBQ3Rv z^$viHH5(unyZ0h2XH0}H3v`jpAP+Q<^p203t|yO&E@+a01%qA1In=Mn)CFzO@CR|g z`}olV=uS@sZA|3BJAv9>i?0++#|&@vT+3n=#W?N1(%$W{o!?Bnj&@x+PwwOPYM5Hk zpEJGS?@2rP>3(wXezmu@1Wk3eyk1CJEZ^S@W6JZMnb%NWAuL9-9rVI`^?hWz*|?Z| z8kBiE`&He6+Pimh+qiy&v0Za|u=|J2UAg?Y5}&lL%=Y!_?)HBQJ>v%f&lvmZ8f&#< zZ*9wAv-3lWN^6u34GAIsraAyAbcI4AA2%eEm;Ltf*CN;LV=f9Vp4*!(OCCaLE znioL7%Q2k)nk5+jktM7g)>xrGsnV*poNI}@iS4Q;C+(7|*osFME}YlcH2f@SkxOHh zcJG(qe#g?R*zGzsCtKfvr33T91LOL{yuYR^_xgFne5VM=co}Ta9>rMsF7!Y=UM-x= zAm7;llK=?V{A&cI=ZTlIdunaOQWFw!0zMS2%))%zQYSZ5VM=WQekIX_p4en4b@)id z)(}Qpah_Z%-s=Ji`|@0FS_zWGeuF=96QPke zay9;#`SdkryEpDLbv7D$Jv6SxVhXvEt%+3&VepW+lPStn%*K%I#|+Y?8qf$d^8$26 zHlA={r2~inQt<_Q$*oFOH>ru1mi!o?)gS{M^x*nIQo$NPjT#QTYoELxPR=luryHE+%Ath zS-8!Q?dlIvNfTXj@Fa(8StI(Yp}hVysDc}Y1O0JOXdDn%?o7Q4!*S;YoRV^lsFspp zy<@1ujXZ@Hg;9%@2!}Jahk#}_w317dI<5t-1L@(2jmOMk?<&}ID%JDa`2oczel{9Y zCqXbsaJTM3h)3oZ>TJYE><2k*gE7o1UajRk@)VOU@5Q6}jwnzS0xp>O?; z47mT-R34dHLc`Shs}E<-MudjN(n}!mPo}Y}%5(`UZ&vfXiL9Aba6F$tV%BX^2d@Hm z4$U~kah0S}`mJ?*@<4m8OTFj<3RHk*0ff#$UBo91089Edte~QYo1l-*7Oj#Z6wvPO zsW{?I6LJ6CBw~M@SEwf98-hXRCu~@Y1x*p>?52bLdv(P;k(3$@VAgO@Pj7%kL{Rm} z9#f<%e~HRey;q+Mn)+b9Ny?Y3oVs3dM!rA{Wi{4#{d3Z~S{i+*%W`8Z)lEfv2HiJ` zP1l$jd-2~lr!2A;`xmZO(U~k#R$7n=>2aT|-e6D_`cKo7eU_Xir;;t6%bHQ(XPKmf zNUJg(%|`J|HujHOYKu1q=#ob$3y0{9D@R~DhJxPF1Ku~>&UHt)XI`;SDg9fO*UjL4 zFPb{K4CWNLMKydzTm8<(0Tp=QcZGTU8So!b$Td{lKrhUDs0F1`?GfSTJSOz{*&5+_ zB7+4&SKYmBCWn|@`?%pxT83L2O*XZWLc1ii-I+2^BaWTp$n31?Zw2l;=FWGQ#h#3w zbWAe*m+=^`sm*9hZ$eQPEcMa#o{VITQtEY`tl5jK(bXn+Tb(OptoOgz+#znay?Ta_ zi4444mCpknX9FJVFfWRaIz*!|1y9WlI8Y|H81TfPcS)H+@0b|N|Ir{RjVJb+>d zn0m>4-Nu_~KiDF^RtTkt(mOv+a8|znmVSt(AY)&ODLHPnlG4 z;jZ?iZ#{IR&!9_ez2R*7g+gM{4vrlcJ9Cs*ose*bVLBcfSQ#mak1>d7QONH_L*8TYK!qva*d?GH0t&Ij&9JQThkRk@*i2#uR zrPJ5YxF-6n{FH(>#*aDyiJg%(e)WHHXGKzXRoImxa5DUHwFLYDGy6+TT{;V>yoIo- zN5U*_+T(rx62M7)fe+}FUHwlq=$G0vx%McsM>s>`r>&D(Jhc%JY9mr$qTMlYrdh&C z7m_l?BbOyv^lyeP_S_R-L~%4KK$m*X_)4Y~(s(N-btdBzaoJ-Qk%>!H4!^_xE_?6X zG{(wU-)>i;aE930&&js8KjH8gGZDB(Y;lD4K+?b0+G)k}+&3yBI> z%PJeD{tPk{qyP4?T>W@30T@bNZe>W|^B|||2Znek(V=kGQ5faJ zAF|F+QSc?KCS*tqpqtTw4 z$vR*!*kfmy*T4n%BJ*VVqGgf^6&jMiDwkmep5o`;?gM1O&`*!l4XC+94ycr?;VVF3 zg3&>1saU^XX}&`w>8-GNOg_X)twtGf$Ee2748~Q^_|F-_O(;grsEfC#U@BTBCVu1~ z&4i&8`s~5$7I(SoNV+Yk34I?e2j>M1;T*BqdqSW#0ki zocT1Tpf5^l-g8bE7k8Na2Zw-@1YYi8^6%F~PpWW8R4)_j=RIlC zI96V?^lwsxpiCr=b^(Rc1_duhLrj0R^+#0#bo={i+i_r_Xu|+GGnnItyGc<%W=EpW zQ1h#}%4_2^HBz7rrf3XII%S+aA6SduKTrO~$SFYF$2eQfr&wrNK@B~dr#4@LZ|$vO z(w+LPJ+(A-NM)LNd;Fkt41vMT2xSA2!pg6(LF79Q-(4%myMv$z`z8s#)_g{+^{$?H z;%uPWZI>B1jTQ5569v4?_oeS{arp%5xqKm2$OIiE$XEAjtl{ae23~e~AksCgsgQ|5g0>`+UT zcNglB4Ke#HlzWd4%Zrp__D}WEmCsgt=F?&NFzJyS)n*9rRM@f?c-4zQ(OUcvOq_TX zp2X#9i6RIrRPO)*!aEd2Gl|Ahj-Lni*RSc0Gz=zwLQmyR!LM8Y`$HLuMRWJ2VQ8DF zpUn*V^A<(|6qUx9eopr#M_pT4k5w>p7guS}V6uHUUZ96M`y#6a-cqc$`M`*P%?9ROEXjd#n)!+>Ck>vf^WD$G}Wm3v*ID@-jGWAv<8{w&i7jA zxQ?`?VcaPTNAlL@<*U!ve;w<&5vvmPM9bck5$xTN;Q1y-AW$5dF zCLZJGL(8x4l$=NMUqkCZ*r~=@)G8;u7s?o%oCC#q9cALoJ&RwpO{*XmJ0R9kQC|TIGZZhZ}4+z`orz6)>OoO3KdL@CfT7$61IpHJ?dZ9 zTLX*$2GaYRAf(2mVTSl>;J+y!LK-nAP&F$Aj>fJ>DM=A9vxPx_UB(2+cZpQkCW<5v zXqihGE*D=s!Mx6t4`mm4Cdh;)D7==3$ZeO(VkHz-h*2u*hmj-tmXBg~>J2Jj^+-QU zm*uo5@_E@U6knF6)-4csvFQ((Ytrv4A zknsW^^H?<jw;&M#)obo&)o-x6`P?f@7j14*+5GN_=ZQpid1jKCUQ&rB-!Tt} z0k*D6m1lepK(#J4uGg73V==F?1TfC)my$Rc50kp9)KaxmNrP&}XAhMQ8TpgQI5#zT z^>~mB5R;4Vu*qj0dv{F1y^&|x*{&nt&2C;)T_t9Od+DT+$#%TGo}K#B<#$i8K&SOD zoduv-P9=WIbagow9$T_Y$EIN3DCGnlNdALGp_d}Gvw5q9a*syo^Gn=Xa(d<+XpkQE zXx3WsYjHm(AnOevFw1diiJD_}T{prC!IUHk(u4?@pVhY=TG_8;2~xc#O&=UPK2|y( z#kDPs?V07YB(x-HOOU?kf^djSm8%UuYM=v6K>yNfZA0%jH1&59jrwEcHIoF$Ck;I zIXG;v(v%3}B1+TQV zMuQJ3Y90;Pj=Qf@kWg!zBMHbs-cxTVy;6Ic#(=^# zfR3ijtRySxD7AHnZsS`b^GGNST}qRRCEmbcn;M|PayMR!PIIXZ$`Mu7=y12w9letS zi1bqsj}u!vPgc;Uvo}ZCaE#`TNk(g3g<%s=Md_)}(ugRP`NI7b3uoj<^{#n;0kkB4 zp{~%Tb8=;^Q(VSaqB1U9aHq>^F~+>e(hoT;Q^LtkDjV3cx>Us~nG~Tj&;ltal~>8d zp{>6H#(y7<{54_x*U&@P-pKMlM5=|)b)E=UxZgid^*q5j{PZj+*^DKTYtn1O zMK+c-7_JX&9=qEBA}^(lrd1GuqJqo_T1(%95>W**QWrp2NT5bd(iqEM+(na;;iODi zGbWU&Y8tMmoz&fkc%6QFO6$g=KbLaCrMY%v&Y`vF)pdr<5;rZ&EG{rh^V?D~cr1Gi z-+R?q3W2fzY0!wT$*j!)8LB82*m6 z|4j@H+#$n79`FI3r>_76nN9lfQp3<=j~CK(zZUX`yg|FXQ~GaE{o8)&%Z~6ZHRRB9 zV0xy({LawD%i^nDW?tokfTFk7%=56V>keTMU>m33JQ7oYffKD>Ll^Qt`}Dc|~To){5=c)#lC1gjaQ- z6)`kSVSt;zw&v&fzBX3BM9-i=D0#~^Sof-}J3aQUA^xWv+K_tM(7#RL>ihV=jK{{x z%E;RBAN;RUeoW?j*4aUH1DAB=IEO2z%ux!j0D=e(dk?g3IH&fEa6v0SwzS9W`3`_) zfmhGeZcxtyTn$R>Op)ZyL)FlyRy;W1S=y|d9$ctG&C0r198$5PjZgC3k!)% zWl40C6H6Hl5eB;pjMmK&$tLy~i+q4pX*McUCF#0_;wfP{I4&dQ)SQWzGbCkyw|NcE zR_0VtY%iGtEvswK&xVZbvIcQ^()IcWYtc)kAf!kox*^<=_UB4qb?D*cwv%`NKc+Wf z9-1a!^}#FQfDg}LXf!D@{`El3ri_Pib`N0xy9+}9!>J7I^HS>nw;WnTAEod;@{C0HDobzK&EJx$qBj zkC{H@M5S0YHxmNkq%pZP3RX z0B^QEzj-og9#gA)uqo9$Ri%nij_zIvISH}0q|Us;qJ+RoVWx`^&ml_o#S}m}hxEzK z-%JvI!#LRL^4_vd-W9h zMy zn^-DjK<_s$i}Q)PQ823zK&GVw3(wv_7dIYRXfb3i?mlS4O&tX5cB{d9^AIG--{ni-$NQGHfz(3 z&ioE=1VV)^N4K6wr-lnlK`%p`GY7wyG=)1Bd1rB|MJln8vI@zy>=JwN09!IObe# zWtc-;+hTrvXo_$7XJI#=?YuEhLW{0b&399UxGpeRm(U93o)D+carGpUH4QdzR>HTl z6i4Jug>@!IM^0~2tu&HiTJJ2Jn(aV=h6C$}MV;R_;lwP(w+B?0RbiWRPioaF#Ueq6 zOmS-Nr>JoY4bX$DIw#Cq^Dx*Mq#2)dc<7L2F^h`APF60CYQ5b+6$nbgm~fYRnlMx~ z`0WbYvMd+4pgiaK0v%yoP{2CEYld z(4Wb0a2;Vhe8&})_1W3)`m;I5&ksx%Hy*F+-LSDM%D+V}WU)3#0Tn+a(t_FrGb;GP z5|EH|9~5k;U`GUD@xiffb>IXQ0u-MP~kIF@Aif^ zd=O28E~iEnp2|b(JJo11XETp_jhIO7o&{+mkbDPcRPrJ&P;LoH14oMdiJVm-{&Hj0GV#nUD^B z1)Xa%^y`qsLk}Gwas(b^8_86m$p$G6QQ;tGau6Ms$*s-7n-PcYW_65g4F<7^B}DG9 z?(aNngL^WaRoYHFjA7(_K7)ZK2E!p_w+LF+1V}OB|*mAI;~R9%IdQ zEml=EU&PNqyKC9Zr)nv=JncV=lY~_xU)1|fnl;Y%Xwdi$lL={kR^p9X3dwiS7`y@A z2}pq7EYK#`tDc(10%>qRyG?uGFp;6&;VkPLY5;(NcWl|s&vf69{ou)AeZ8(idW@SPQZ5C%Nd$a?q+MtvK)xpjf44`` zqBGi_01~w5;f_a3TJSUjJ>^Tl&M`1*_RNZ zaXI9Acn2D{D1s!<7_^;vNBq{sVvldZ3ODn3`M^$G(sj3h)GCoIdArL|Ol(izYf(`f zA~yfS8r5-LsHTy%uWft0#U$a&yqz!;wC-fj??)n%EDOuPZq;K)##x;EjR2ZA*(SJw zfOR|C@QVXu`U=@yrF(MusTER&Lbs>Lk;KkL@^e2sIo$xE zMheY>Ev*au;(VK3R(nPPJuBK0|+X#XBd_4|V3f6Vv9b`^))LLE;3j zJHi{#@m~Q9kV-m|?Q?2h!F8uQ88Z*@zt~tq6A`EVRx4EKO93SIewxhPx6rk;a}Dis^OWlb*i=DH zt&@B*Ehp6%0KDn6l-kv5>GU)|JCzIpCIfGc^n5aA{fbU~g6Q*?A7|#GM^1jaO`80D5|Z#gf_ekKNqf zQT`kA>_B7uwc>1cI}Zqry`$iw>n`nK`|<4zNKkxuKHBlURDhd(OS-9C$$d=GIB7 z0kcQ008*RMQPQLcaSOu2%DQ+Gt#WbSRm;RDSiBz)1JA$@!lxP&DBI)V33RJY38+s= zGo!Wi_mL$y5(j8yEl0(iU&SRT;Y@-ZjZ8?jTZiS0PX{Lv!N#NdB_p0{?j=N+vG_j~ zuPh8IM~|W4M&id0@1as2(TQ}{si0cJl9tObqZ`$@x z#%7tsTkiQUJD4ZMKJ?OdD3(an>=W8Y>_s|J6E72HPPE8UpzCEC5i0ZBH@Av0W!kQG zZe9D+9S;jFTk|!*c+Lj|Jj6lQ+9~rj`6eL^W)dV=a$xD+dwJG$mJY+52gBA95eo?_ zs#EQA51Y#@@7x>xj9-&M6pV~d{>UKgX;u3jN3*u0WDe&Bfi##d9x-Mqz^tbqzCE%r-GF7}J9sOZpPl5eL`x*jGPYo# zeRD3NJ@o!U#wa1wU8SeiWxECh{dp{c#O}a*g=o7iz`ZISklo{b_9vKM5CCsyL!Q~%h3(ggb1(0P z^;_KT;WY2RaT_EXQHkYuyVURH9zAm4 z6OboZuCPm~C0ZJRL3_c8><=?c+xlY#rvx>8UAKZW`qXCh6ig!^s#Bx?O2X{`c8 z!fai}+@I38-{i;COdTAotbJSFGVD#{(&tmhJkl@|oIYqJ3WQ-O#Ok>j7f-%MQXn=>;KwvOUXBMA|9Z}@*gMuiHc4jH_h z87yGvDPdwMb|hxetIa~A2lHnuIJkA?%;5os83&;Z!t~)2M*JWZa7+9oT;nNdLI9PI z_|;7%W@kYma2@-u`SHQymx-W->)=B0UkB<;NhFZ})Nt&LSKy$E5MpE^fFF1i`&P7=OeR9~eqUVh%r9uWL4s!9R{T!080pg`dwV_TZ=S-d-t6vty}wL~ z81XxfOM|RmTVu+dJYvY25O`W+JL{}xOr1pu6vlq9sN`aIKz@gyf2uL)Wv?E}3-8qb z=_k&nG=@Q55=XZPQV|kBqrSsFq}y_oRJ zCs2a?=!kXU&hltj(qp$30`lk8 ztoF$bGdPa1!kqNH5fNdi!WAmpMy?gu@M`PCjmez5DGX-!X){LCuMFRfZcVG*zQ=8_ zWQcymFD zPV9?3KUE2)y8XjEFO0p)_mm<_ioDe`igu-<+tty{vuUFODhCzJCn3p+U+=Gm_UJg- z=+I1+N(CgAK$OFY^BRYMVrVkLloO!CO3L$EvzRZF4k>eC1H0sDq9VF{skA1r}Vqfc6rD7-y4O0G0Sfb>8St9(&#_igw6Ua9uVL0b>sW^XMFu9 z?(fszEkdK1iN9L20as!j{*5lD%)yXl?A#4y0l?U%ZUFI?SdyQi9as`uxMcj~6hj|B z>$&!R-Ca~X_lc3Zf{Y1+{_sRG-T*u>RnY zx=2$83tZlB+EK9BjI8Ge>}T_vmF&KTZ2;X`)=UqH?)2L$X=2<=&v@U?WA751v6%)j z!Aac6Fy1ujxCGw+UBv&S>5isGR!09u)BoCjx|8EDX9{)YVx{zng1 zeZzW<6}bzq#s%N;>QuMRpEHnV?INjwCapn}&MY-)SuT%%Ry-oFCrhu#$9j3fXXD}* z8%UGMX^j&cL)dM!p`vs<=W-A&=&#S;N7s8C`=X<5o=22K+dmkh%r;rhHIo44aOWT< z;y=CC_RK-FvaM4TSju{Wz%wUWf zZ6(w}L#i8va_CyvKqq{!Gs^r-L5vTJeRA->R|b(n@ga7Bg> zrUmxNOkV7U)42+vxA+uT4BL_3-$H9c0KpFjo*!c-y)upWuN|(2gn+JvZHRr)TqJ?U zJBY5-8g{VW|J;IdxA>Ad@kV2V4(_E_+f4#MAF?lcgk8LHc?I$gt@Ihq8+^jYZgGau zy}7#F_VBtX-PwTITp((2L6+;=9f0>!0+PHZ6Me2YbnRbsY2EKA8wprE~R32 z9oSAwySU@=WdrHiT`zaR)jfFK@6U$^&F(*|cfrVIyZ+F7uL0zlU%$4ic7ME{K0N7u zecnmJbPR2`K=Sru>~8b40Y{sHI&1)#j&DxwQU|se11g5j0|XOR0$$PK&+NRG;Qk?# zDhq&hb@{9qd|)&x|n zP;bac_LQi=I1YtpS~50_agk+t5sOn`^-8G8{R_4b{$?!iJvY`1hE;IaxD-f9pl}(-Q#EGDCma8=08?;jd@=c&ShbtBrItz$8B->QQS2BIK zSYj=hh`Ddp#FiGi)SQ^8R&Q3+;}R2%<0SK=Dm#|oArdOrjh7^mtE6&jMbw+LU2?U4;ij{HFEMKT&>wT) zE?;=`ur5D(tKz=5vY2+!8O{k|uK%z~w$OFAN}{PNV zp&)-eRS^%{#Yt-16JEy6pO2s0f0icpy^Ta1XrOpGqP*fNDkW>-Kz&`lv8KFcISC~S znGQgHg{pte?d}D?h^G&AE=J=5kZV3CIygne6r#lc(K$(@VCOI;3iY4Ij;(|tDy&3z zP{79y!iWo?^5z?!@Swln>7mfHSQRT;2l$nOA7x=grL%@0J^R!n{tGvqGe=_)p!UeG zy%=}?iFm?Av=C+mDrQ6EBm{Z~%XFl4Mg?yjg^yq({&zkbq&zZA9NHZa+PPQF29eW8 z;&4^iH8+37TEcp5-L-GfG}+^?e&z?Keh^|;#uK&NfmSrOqA{Nr1$JX(JIlgEp#0Bx z3hu|U*__FCBVJ7F6r2wA@f}H1na9VVmQjlc^52do`~>D${WBWb3DbIDZP&5W-FCN) z@d1y!GpTd%-HTl*E{p39&UI5VPNhpcw#uhS5uOnY(4TWDChY$A^CoZ|jwmVIky%eX zOkNe(@5$1|H7CQLP3b*-vi-K(j`DTI+*MhpSRa+)M6T)^ZT>m}miDl|D~a-OH;0^E zEm3q;d%3%6L5TeNux*84pb`Z53YDe?(9gAg@qKu%b&H<0Rl2!G9oOE{#%s)}(slS6 zbaVJ4d1kgaB=Pv_m24vq)RDxWR(kkd=6g&=z7jGpJ0=ck8+!H5a3QaGw z)8@^OO@7!`TfR(0%&Q?HIN|>fl??2^4AjBY$moB(`AS^NBJntl%xL><%uL_L{Li`a zU&j1T?BA!qYnn(UE7@j9k0zz70SBKseg}6md_xf#iR(XJ#jM^y%sMSkx|^1Gi%B-#C3VC zoMjcM-Ja$Ujj!9zQPpW<9Kf#PAiOcmtko}LR*{FRrHQblCKH}gKrH?}Z_O*2ZV^mb zdD2U%Lyn+>wm@0x0;<(gpo?&BG}VeOTK3pRZaiz^&=+9=s6|wG)&?FBt6kA9j4Y&r zQ065wNqAVEaRaIbt{?n<=?K7@?%rxbk&(nF!6eWJQeZCj-~d~fY;J{6nt{*_HTnzr z_ZcYbtz+YU9Mcq33t7Y`dVW#_sFOG&#`Bhd@2%5)tjc@Vr4-i8WBU%O>R^T7F|6JY z{%U zVP%gH84463l&kUY|>17FDfIzCOTF7k#<;J zi_sGYpZ$TT0}C~u(QroE*$CZ)SFCT`>&MK1?T z_9GvpO0Cy;G&Qn^(h~pEZ}35}V*~@wr9%Hu!5^zk8h+8W>vs-${Sn|9cfZ`mRbKiObr)PzFReNZ z2rdql#ym;$qZ(*qI!`SZ##w*jbFM@h3;zNsYUT3g%8~yQaWP7)ZD*jHTA9NVbQy|b zV%Q+}^Ki&x^s&`Xo;>ogTP)jv5=jjNo@s^|g08?zVpK$x?HY*rzY980B_* zqU>(?00N*b)?1H!7kD^IH#88?w9Yt6FAbEW4H$3&L+(#)i zdnVw)c+Q{8bH;;rl!QCj=^BooHiw``KRcu_Hu+XE`-{8z+ubta6KtuCY7lm(D_VHF zD+*s;A_lZ>qB9xJYL1r~*pgiWQM!Xr(kotvd4#;nGQtR0SaIN@Mydxb7x9%Rwp#dR zRzI9z7@3G3tEFP(trsOmaBnw`B@%C|D27u%N`moDGnmVKk{KCvI4 z(De14YcKR~sPwL?d!1h=^PA~}4TxTU_pYa-R!r1JLh*|a=xiky%v@Uknj_s~Hfp2Te(L z1Q#APV39Kf^+K4kUkhFTka(+Aeob!b-&xQU@+FB#X{mqoh%c7iYRDI_G^_(T3Y_5> zwGBg@9=FX6$L^%bc84Rs@imtzoQcWDab?EX+KkZQpT&=OEUe)PMZR!Q3ev-axTydZ z=4M58l=?r7Tnjjr*&5zExg_JZl|&*&D#X#KFqB)Nq{~R-9wJeZ#<=EMlL~<8l#-(vPMwG3hv;Kcu?e*_}+vn`(@q7>V^S$eR*SEfZt@VFvwLD$3 z{LhvpReK7r@?Qu`6OGgJ$o7p&eG!<@$q=*7>pZ|*+;O)xvZCp}MTDqyf`Z+*w-Umt zYE0LjxMTL{7~L~)1dsri)j~Mwd4&36U@c)ch}q=2xlK{ z7s{}pF-Px@gTC1YQZm>E!FHoqUqk1?tSXMA8ZWTdWI7cy8+9dAy(84xsL$I%u|sEu z;&NV{W+$08Sb54RvHod%n8z6|oD`hdz4EM3xTJ>E$^nB&sGz*$&)KO7c1vmGeT-e=uj6%ZoBkA zWW=M9<3%_4#@m!KloJAvexAA3o15V2xH;#WUFtdS89N@_cyWs!oEIA+Ii0&*KB4`| z#V=}mXRE98$DBg>Fg;mY<|Qf=IgCBuyRwpYj>IP^EJYiac!X`OU@?BueR&U1&9S{~n-{;YkBao)LCO+~EGzVoq# z{*Y}*_p4zIT2lU>b{p4U^-_7%`cH|((}BzTSDzGf4g809^`f!Qjtkmfdrq#r1 zX`QJ$pXYC?gX#svCGEmJ{Zm~JN9XY|1OM?(?p^{-Cbin|i}u7X2CDS!>D1z3rj1*= zyu#B`0mj4Ebp`a!vy^uMA_amfyLwKIW$L>XeUo_fT`jY0W&FpKA3OIZ7i+%v$l4jq zJg;pYw>Lj4^wZx3CK4r@2Wn^rGNP_;U-}Dm=uhZQ-IcY?Y}8;J9UqRj`dL6VW{B^T zZK?6fJ4HiE&8K7;yBHKch4r5UlY<6+7c$xx9u@2MeNeN)3R&f9ns??)`3W%;yA0L-v&Frl z=Xl>10nv*tjrLBtS)L~2a(-j3HZhWU5su1TM>2eN(FV>c#Uvfxyi>J5Rd>ZJ(Y8d# z=J&Z)hBEbXTFrGb+x3bT{%UAa99`=(tnSlZW+l~E73;JlCjPdPmL~mUM&sYV>F?tg z{#Z~mn3X>VU zZde}zO3J7UR#N7xlTrq~fw82fy^CQF#2fd7FCW`e?g-~ayGWFu8PZhX2bxrv&_ zPi0QnHGl;>=9)DQF};bGX+hWFz|U&%^VRj-)mkV5WlLV8{o7xthO1~(7=mN!%m>VJ zA`mZsLJ``*`2UIkuY%$RF|z*%4gsNf>BC2X5STueAP<8aj5<9xWri!`@lzMB%n`HM zDYi1)MHePG^=3JpyDtg#?bT?A`#zA-kNakZeL;M)RVUu61RIR0ev#mteRKdtfy!qk z#^AC*iz-jPl>?$E0F+{ob%88%3~+<55>OPgKHGCA&kzOUQUQ7Z zL17<(MqwbC=7}>n8EF51m~L>T7$*#g4TLeZIm;7y9E%b=u;&H5y*>&Df|e7Ic$xzR zd@9cZM9+3`qXc^iS{4HLUJ@bnk_Z^8fYMw6@CiZ|TbE*jXPW=jL&Vb&X!~_IyrXr- z+<1g_C*w+O2~FhMHN@h46iIOvkq1YqJ})o`%1bm!f@oC$85NBj+)%o@wjQ3rO)Sku z2~BdvKn0vP-k^HW@*=i~Kn(1XV#HXL&!}dce25P;)zGiK84VnTRMmu{d1l}OLCcE)F^;Z$$6|oLnnztj0&rq9-{gh(o*yMpj=E;Q^+!Qq`#05O zacMt$hD3aogo0G);q6Bk)Vu&75HEp52?On*!B>E}&3@EBROz%-C!RgV_LCot0~5-l6Rmh-EAKbVHJTsWV*tz8)f5x(GFsXa`|ZC?WsvFs literal 23099 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 diff --git a/xmlWorkbook.go b/xmlWorkbook.go index f00a0b85..65720337 100644 --- a/xmlWorkbook.go +++ b/xmlWorkbook.go @@ -151,7 +151,7 @@ type xlsxSheets struct { // not checked it for completeness - it does as much as I need. type xlsxSheet struct { Name string `xml:"name,attr,omitempty"` - SheetID string `xml:"sheetId,attr,omitempty"` + SheetID int `xml:"sheetId,attr,omitempty"` ID string `xml:"http://schemas.openxmlformats.org/officeDocument/2006/relationships id,attr,omitempty"` State string `xml:"state,attr,omitempty"` }