From 301aaa4e66257fe7601b5b4d82602370123c1d54 Mon Sep 17 00:00:00 2001 From: Leonid Salavatov Date: Sun, 7 Nov 2021 21:09:11 +0300 Subject: [PATCH] 2.0.3 --- ArrayToExcel/ArrayToExcel.cs | 4 +- ArrayToExcel/ArrayToExcel.csproj | 8 +-- ArrayToExcel/Extensions.cs | 36 ++++------ ArrayToExcel/SchemaBuilder.cs | 95 ++++++------------------- Examples/Example.ConsoleApp/Program.cs | 4 +- Examples/example1.xlsx | Bin 2431 -> 2432 bytes Examples/example2.xlsx | Bin 2435 -> 2434 bytes Examples/example3.xlsx | Bin 2436 -> 2431 bytes Examples/example4.xlsx | Bin 2435 -> 2435 bytes Examples/example5.xlsx | Bin 3032 -> 3034 bytes Examples/example6.xlsx | Bin 3920 -> 3924 bytes 11 files changed, 44 insertions(+), 103 deletions(-) diff --git a/ArrayToExcel/ArrayToExcel.cs b/ArrayToExcel/ArrayToExcel.cs index cb25ad6..fa9ae83 100644 --- a/ArrayToExcel/ArrayToExcel.cs +++ b/ArrayToExcel/ArrayToExcel.cs @@ -17,10 +17,10 @@ public static byte[] CreateExcel(IEnumerable items, Action(items); schema?.Invoke(builder); - return _createExcel(builder.SheetSchemas); + return _createExcel(new[] { builder.Schema }.Concat(builder.Childs)); } - static byte[] _createExcel(List sheetSchemas) + static byte[] _createExcel(IEnumerable sheetSchemas) { using (var ms = new MemoryStream()) { diff --git a/ArrayToExcel/ArrayToExcel.csproj b/ArrayToExcel/ArrayToExcel.csproj index 8c92721..01f776c 100644 --- a/ArrayToExcel/ArrayToExcel.csproj +++ b/ArrayToExcel/ArrayToExcel.csproj @@ -6,16 +6,16 @@ enable True ..\ArrayToExcel.snk - 2.0.2 - 2.0.2 - 2.0.2 + 2.0.3 + 2.0.3 + 2.0.3 Leonid Salavatov Leonid Salavatov 2021 ArrayToExcel ArrayToExcel ArrayToExcel - Create Excel from Array + Create Excel from Array (List, DataTable, DataSet, ...) excel xlsx array2excel arraytoexcel array list dataset datatable convert map mapping dotnet true https://github.com/mustaddon/ArrayToExcel diff --git a/ArrayToExcel/Extensions.cs b/ArrayToExcel/Extensions.cs index 02058d0..d8478fb 100644 --- a/ArrayToExcel/Extensions.cs +++ b/ArrayToExcel/Extensions.cs @@ -12,44 +12,38 @@ public static byte[] ToExcel(this IEnumerable items, Action>? schema = null) + public static byte[] ToExcel(this DataSet dataSet, Action>? schema = null) { var tables = dataSet.Tables.AsEnumerable().ToList(); return ToExcel(tables.First(), builder => { foreach (var table in tables.Skip(1)) - builder.AddSheet(table); + builder.AddSheet(table, s => schema?.Invoke(table, s)); - schema?.Invoke(builder); + schema?.Invoke(tables.First(), builder); }); } public static byte[] ToExcel(this DataTable dataTable, Action>? schema = null) { - return ArrayToExcel.CreateExcel(dataTable.Rows.AsEnumerable(), builder => - { - if (!string.IsNullOrWhiteSpace(dataTable.TableName)) - builder.SheetName(dataTable.TableName); - - foreach (DataColumn col in dataTable.Columns) - builder.AddColumn(col.ColumnName, x => x[col]); + return ArrayToExcel.CreateExcel(dataTable.Rows.AsEnumerable(), b => dataTable.SchemaBuilder(b, schema)); + } - schema?.Invoke(builder); - }); + public static SchemaBuilder AddSheet(this SchemaBuilder builder, DataTable dataTable, Action>? schema = null) + { + return builder.AddSheet(dataTable.Rows.AsEnumerable(), b => dataTable.SchemaBuilder(b, schema)); } - public static SchemaBuilder AddSheet(this SchemaBuilder builder, DataTable dataTable, Action>? schema = null) + + private static void SchemaBuilder(this DataTable dataTable, SchemaBuilder builder, Action>? schema) { - return builder.AddSheet(dataTable.Rows.AsEnumerable(), builder => - { - if (!string.IsNullOrWhiteSpace(dataTable.TableName)) - builder.SheetName(dataTable.TableName); + if (!string.IsNullOrWhiteSpace(dataTable.TableName)) + builder.SheetName(dataTable.TableName); - foreach (DataColumn col in dataTable.Columns) - builder.AddColumn(col.ColumnName, x => x[col]); + foreach (DataColumn col in dataTable.Columns) + builder.AddColumn(col.ColumnName, x => x[col]); - schema?.Invoke(builder); - }); + schema?.Invoke(builder); } private static IEnumerable AsEnumerable(this DataRowCollection items) diff --git a/ArrayToExcel/SchemaBuilder.cs b/ArrayToExcel/SchemaBuilder.cs index 9ba0326..105dbce 100644 --- a/ArrayToExcel/SchemaBuilder.cs +++ b/ArrayToExcel/SchemaBuilder.cs @@ -6,103 +6,40 @@ namespace ArrayToExcel { - public class SchemaBuilder + public sealed class SchemaBuilder { - public SchemaBuilder(IEnumerable items) + internal SchemaBuilder(IEnumerable items, List? parentChilds = null) { - _rootSheetBuilder = new(DefaultSheetName(), items); - SheetSchemas.Add(_rootSheetBuilder.Schema); - } - - private readonly SheetSchemaBuilder _rootSheetBuilder; - - internal List SheetSchemas { get; } = new(); - - private string DefaultSheetName() => $"Sheet{SheetSchemas.Count + 1}"; - - public SchemaBuilder AddSheet(IEnumerable list, Action>? schema = null) - { - var builder = new SheetSchemaBuilder(DefaultSheetName(), list); - schema?.Invoke(builder); - SheetSchemas.Add(builder.Schema); - return this; - } - - public SchemaBuilder SheetName(string name) - { - _rootSheetBuilder.SheetName(name); - return this; - } - - public SchemaBuilder ColumnName(Func name) - { - _rootSheetBuilder.ColumnName(name); - return this; - } - - public SchemaBuilder ColumnWidth(Func width) - { - _rootSheetBuilder.ColumnWidth(width); - return this; - } - - public SchemaBuilder ColumnFilter(Func filter) - { - _rootSheetBuilder.ColumnFilter(filter); - return this; - } - - public SchemaBuilder ColumnSort(Func sort, bool desc = false) - { - _rootSheetBuilder.ColumnSort(sort, desc); - return this; - } - - public SchemaBuilder ColumnValue(Func value) - { - _rootSheetBuilder.ColumnValue(value); - return this; - } - - public SchemaBuilder AddColumn(string name, Func value, uint width = ColumnSchema.DefaultWidth) - { - _rootSheetBuilder.AddColumn(name, value, width); - return this; - } - } - - public class SheetSchemaBuilder - { - public SheetSchemaBuilder(string sheetName, IEnumerable items) - { - Schema = new(sheetName, DefaultColumns(items), items); + Childs = parentChilds ?? new(); + Schema = new($"Sheet{(parentChilds?.Count + 2) ?? 1}", DefaultColumns(items), items); } private bool _defaultCols = true; internal SheetSchema Schema { get; } + internal List Childs { get; } - public SheetSchemaBuilder SheetName(string name) + public SchemaBuilder SheetName(string name) { Schema.SheetName = name; return this; } - public SheetSchemaBuilder ColumnName(Func name) + public SchemaBuilder ColumnName(Func name) { foreach (var col in Schema.Columns.Select((x, i) => new ColumnInfo(i, x))) col.Schema.Name = name(col); return this; } - public SheetSchemaBuilder ColumnWidth(Func width) + public SchemaBuilder ColumnWidth(Func width) { foreach (var col in Schema.Columns.Select((x, i) => new ColumnInfo(i, x))) col.Schema.Width = width(col); return this; } - public SheetSchemaBuilder ColumnFilter(Func filter) + public SchemaBuilder ColumnFilter(Func filter) { Schema.Columns = Schema.Columns .Select((x, i) => new ColumnInfo(i, x)) @@ -112,7 +49,7 @@ public SheetSchemaBuilder ColumnFilter(Func filter) return this; } - public SheetSchemaBuilder ColumnSort(Func sort, bool desc = false) + public SchemaBuilder ColumnSort(Func sort, bool desc = false) { var colInfos = Schema.Columns.Select((x, i) => new ColumnInfo(i, x)).ToList(); @@ -124,14 +61,14 @@ public SheetSchemaBuilder ColumnSort(Func sort, bool return this; } - public SheetSchemaBuilder ColumnValue(Func value) + public SchemaBuilder ColumnValue(Func value) { foreach (var col in Schema.Columns.Select((x, i) => new ColumnInfo(i, x))) col.Schema.Value = x => value(col, (T)x); return this; } - public SheetSchemaBuilder AddColumn(string name, Func value, uint width = ColumnSchema.DefaultWidth) + public SchemaBuilder AddColumn(string name, Func value, uint width = ColumnSchema.DefaultWidth) { if (_defaultCols) { @@ -149,6 +86,14 @@ public SheetSchemaBuilder AddColumn(string name, Func value, uint return this; } + public SchemaBuilder AddSheet(IEnumerable list, Action>? schema = null) + { + var builder = new SchemaBuilder(list, Childs); + schema?.Invoke(builder); + Childs.Add(builder.Schema); + return this; + } + private List DefaultColumns(IEnumerable items) { var type = typeof(T); diff --git a/Examples/Example.ConsoleApp/Program.cs b/Examples/Example.ConsoleApp/Program.cs index 26d901a..4e90ed1 100644 --- a/Examples/Example.ConsoleApp/Program.cs +++ b/Examples/Example.ConsoleApp/Program.cs @@ -178,7 +178,9 @@ static void TestDataTable() foreach (var x in Enumerable.Range(1, 100)) table.Rows.Add($"Text #{x}", x * 1000, DateTime.Now.AddDays(-x)); - var excel = table.ToExcel(); + var excel = table.ToExcel(s => s + .AddSheet(table, ss => ss.SheetName("Table2")) + .AddSheet(SomeItems)); File.WriteAllBytes($@"..\{nameof(TestDataTable)}.xlsx", excel); } diff --git a/Examples/example1.xlsx b/Examples/example1.xlsx index d48198c40220d2001856abe773e2ea6d788671be..8f8de9aa996ec6efda70e032092b3ebd18ec74de 100644 GIT binary patch delta 1200 zcmew_)F50R;LXe;!oa}6!Ekj&dN8kcZ0%kK1_l*I1_pj0U6G?-o?n!ml%JoiSCO03 z+wa(S$biRny-+1TXYiHARl2ipZfF&5xw25uH|8i~RSgr*hScwWawFegpM8@5QPV`( zRyMI>R;K2K=US7QpQog2-`MgsBvx}CpNsm$_srqJ%=NWi$*QWe<@P?a?3MU*F6fKZ zQ$sn`e!1z{VoUvev6le_fdB zns_B>ZT-XhDs{UCh?$HfM9!tc!8;cyKNAX8nV8iE3I` z*RRmqot_-Bd~K|M>bhy%)MO zJJY`9&Grd@UTu81*3G}X=lOx3OXb9;)C(B#q--;LpDmeqW#JXYgKZaQux$L#f2}!D zQsnfpgyjxv_zzbFtTAVM&Ac&K;#zysU&9Fg4&H*`JGk)a&zo~tq!|TF4bsfhOj6U5 zla0(wj8ao3PiK__N9fj<+F6tLvTD>H%mXIbws_S~wWVGW3xyj`>+M#GQ&{2`eNin? z$gIMQ&*oBG;!P9ZkVgkn)lct#>p%a=`O~FaEqj@(mkU&N0)Zlc`JPd@7`ObpT7zR-337sstF#^W#>=jMdG)1GW%j!U!)2cx1aJ7YPMgGH!@ECnV&s8)Qk=JMCauiQJGED= zChv%`!5{O5{Nj8YmA!(O@3+vdpZ>|sUn2DC?`1+xpDovm+gDjs9{R-%3lmV@-F%8o zn~@WqhbRAIH<1VNAjzD8A%&TNfftyg5#ZJ2Kn@wO8c^Dw2F&r_I2aft5DI{-{>eQY z>JcDwKq0OHR0G1?C~Bfv7#QM1ENR)#lvl&hP^aKfz}=d1_l*I1_pj0U6G?-o?n!ml%JoiSCO03 z+rOLdkO7Ztz3L~v%!N(?UpH>pa7cW~O7F#Hg`(^)o=y>^IlYVwD)n1-a`KR#8XRC?k*19vy3zLjMb;G zR*PS&pPXErwbPxaY|3nvo1UwCnxEd!J{>RQ7pe1bQvuhbt=3xuIa<#9wiHiWSvxtc z(`w0WANiyYW*`602)HiU>wd|+TW?ROO`q10Yjz|W=EH0xDczA(>ReYa$5kAc;q5|=}wyuzo1 zg=~%$NlbIxn8RVlkW?!%&3R)D$2ImOW{GRQz0GYuMcH7OlEYgeusmW$$ zsfmdusfOleCWa;!lV`BXfg`l@e3|v+eXJVwwt0sQc-+=26|7fPElLm%+*EQ>>Iu^- zpZ^NmR64vS&spo-e?>clw@Hc3s^q212j!n180z-buh~95GbLXl^MhZr4vRs_HS^}z zCUb&*ha4>1eD85a(7gq997jHND)ZKQJ)Bv*$=0upOa8)B&)1Jrg7T7&H*a*mtQgO+ z@zKYLjA_Mc)-lZgT3_5Q+wkMj+f1kFb&SPc*9AFm96Z7|nXOLpedNT*17*E!waQ@{ zt2eD#8o6pyUc<+FVXNO2OXLjC&aHd2=1=UC=6ONOs-}9)h|-(7_Nj0G`FR_DGQq+G zly^6uX47Wmgy-SO|JhBVKs;zVXGmdYVBiJjXasl(WCHVdaYw!pg!$Hw= u8>nF~P@@!z#?_N~I5p)#hTqhi|L_-3E`o`HK^R5NzR4k+YHTmrL4p8TCif!% diff --git a/Examples/example2.xlsx b/Examples/example2.xlsx index 6c37c394033881670101c769250697e663e18eb3..7498064301e3fb2122557ea66a6b7cad5a17b3c1 100644 GIT binary patch delta 1182 zcmZn`ZW68!@MdNaVPN3kV7R&>J=ps2P5FZi3=CR~3=I50x*|uvJijPADL+43uOc_6 zxBqP3Ap?Py_@lR~H}(p+1`6qYIWW~cViNDhj=j^aPqC@HJ7s=$zOnV6s{L58`n$L&dDfTFzv|=ah-sbMXqz+ zNcOtkiHy44`}59$X7#`A?d=CkOCG#?ruoEvfs637O|fp`tW)x`|F&s=+PV8LBdT|Q zifsHdpHT?pbCsNWfvG@WGjTF7NH9#E$RSlf_u9q0CIb<+2jQ8!vX|&~c(82V`GZAm zcUsWYo}kNNPd|oh6<*e~E(-PfJ-?1uy#3}LK~bxsrQVUtXY_Hn?TI_RXw7y_yBWRW zk1NfxCru8CuR6Zd(JbKg63>t4X4F3VUA6bI(skvX&$q_j_E0TKUY_;(_1;I750e&s zl2n|i|EYe{vD|}O*OZtm1#U}ER{3whxRuZ+EN2_q?=@!H!AW-J8V2Cki&7LFY$&z7jJt4vw~Su;_-kt6&%wT zHwsIbH6<-pjNm$Q%-{`6*Ib)k)i{Queu+0Ex_a9aI0d{peXLuvmNRe3;kx=SGl~D! zq1Z!<_kGx7{_gv&kE^tppR+4ZPfgw7)RnI@SB<-R>blJMy7W!?usCD@Ct1$*jwd%4 zu}Cut7+EHo7@H?2CMPCYn3$v(O`gjt2aenKd%y7B0;cA@!1$G7m@L34Q@?ehZyu8& zkK1~o%KM&9!85{G%yMoh=_NE78z-rCPWn*3O|NQ6+(Jz!QRUK$zTwmCZ~Oaydj9)( zO{HX2*`gU%?@dm4F({}1*;m}#mb}g1R7d&Y@z`eOG&Y~9 z{7+6D`DKxymzz`JP<){6hf9ZMe}6iUgz?R9QZMvf@^jNOo}MjKm|oBLdCGcQ)r9CC z-c;T{m+o&~wV`3{cPTUD&pJ~>epuBCW`##5{JGz9&Q31Kd&+S?`@+C~dY>Hq-vxLa ziMr&XWf*L3YgcvX5jQM&KskEzIW}!ZPI%6q%*0{BbalmK3l15ZcaZE|TvC~nS`5nE z0p5&EA`FPK05wMdRl~vL$rCu#IY6d@0)O&;4l%1Z76yj+qSTyXeLWC~ZWd|`zzqU2 a)=%c=)C9T7ic^O1;N);lHMTeGAO!%mh3%;T delta 1208 zcmZn?ZWgW&@MdNaVPN3kU|7_c9-MhVF?&A)1A`VL0|P&huE^0Z&o9bO%FoZ%tH{mi z?f2$8WWeLHUZ|2^bH$%k+j0^PPLpoAvQ*Gl<|t!TjnmKEn`bNBuFWp8z7coFV1r`# z!JJu*4$D^>zKc0%x^1#)&g&wLcOrV~i@H5(j~@+i6t7>bza-`E!cZI4e!Wy(*40Uy z9_rj=58*BExcIGTUaEKI)WQ#c%;SEpZV49CzQKR$mz+C$k`JHnAtpht$wv&&PglQE zwKiS)OgJ}h{=5(T{9D&v+@V~%^~ED@jfC|{x6aM|$m4Wv>7RqDKX1m`GoX6*r-&cN zCdRppLLi?rl<8la3G_7+Cj)~7!{iAZQuTAM-OXz<5Mloip1CV~seF?M%jTUwSk!i> zMNRDqx*YcOW4KoFWlhVXP_N(ie@$a#mTiuj_CjNeX2{eeD;0^(tfkjnxB7lOn8#)~ zFZHsOrRLw%GN*_qOjA8yiM(HPSKToo%v!P7IHWpo=hog!M%(jNZEw7pJ#l@l&ooA5 z6|R)}xR4#1JA#&Gx~p_Q%jrpp`~5Lw&0D>rXA&8*v*w(RHRf6S;4bUKl&^11r@+c-A~*#Ikr zi<8_qpK@~U-YCFjaWPw|L>| z3u5nt?FUP6(tVVx`iSo4^#k7Z}G<43qgeW$L$1 z^z}RJz~i>w=+itOC+ABG{C2-=%e~6Yv+na^HRHt_qi=2A_`oBkkx}uAht7=+oBrIa ztD1B_{(ji((KgX?t&7%uvlOuxAN-d1PZ_oQh4> z*&CNrEI&8K%-Uk-7ZxOKEvqA!>;B8`ytZt9nxsMcs=uZe;yd=`vM*VC{IZK*9b@*i z*B(4s`N{4{4)Mp{>v-z~__H(bo-~Uqd(oZ@vDCd84lnD4t3G}_VLS26+`30g{zP^~ z@7+|Tc0^T-cj{N>x|c6+3SX0lg$@TWbT*%5(`Mv^XYR?2941j99w_x!0Rtn2nSp^9 z7%&L%2FL_v{Nj?zoYZ1awh!=TWD;ROloF_U1)-6FVdCU|4s{M#luX{oA!e1p!oUz; ql$ukluLmNL&BBZqWV1F-=Ht|4THH9qHMY0xAO!&QDCVsI diff --git a/Examples/example3.xlsx b/Examples/example3.xlsx index dc8e5d38d9cfdf573a5eb35152b315302651119b..d2bd82b9e6a63bf1d3f596ae1b74dad437b00f35 100644 GIT binary patch delta 1167 zcmZn>{x4J?;LXe;!oa}6!Ekj&dhpF(yB&8kFfgbvGBEH1>53fv^8BLgr2PDBy^7qN z-u}~lhYWaJ>s3F=1mW(m`QVU60V0N|2+P&CdF=bjr=*SxQeJD9zCE$nr*grB@@b2Y zPdQ$3$;ib?SvK&~-g)9jqpC|7^ZvhExyO_BOUU7e$BYBMzd4?w7_hNKvMw_-yn{_V zZFig)cgu3mKgU|umg>IUxwnGrc+BxMGU6deiBndwTtQ>bvFyafU1qE1Z2G=9KfB zT}r1jr*?5#Ux=FfR$_h7%5638yO@{13_HH+k}5}Q-c&KuH&SV9ME-KET2yUT&k}m; z)z^@m)Oikz4CF&jlq!C`e>2b{Z0~&jtM~Svnr!E<^Eqz*cb`x1&bxjwjSrq#CVkGY zq1^SC;NA1-94&q;NFxofcK+ z{N`g3e3S5IL4k8Y&!HRg7nEde_uorv6m+WpzVb!eu7zt^{P{QB^TiO!P zRGYjez42??#)BSf(tEz@Zuny|k$W4-l& zU;D<*6C+Z3dUZBjG!R={7-eL9?VQe*&Fr`An_u^tZIa@CR{YTFg@ z6vSt7S3%RNFZ`9(-v#?>4(aS;fJGYvIDIlG|JT@D$Rf=sV4P}dXqsYRVQ6M-W|CxL zFnJEEoDe7;*C*U5ya`OYdx5bl#V}crQ>K3F#DjUjWZM?6`l;4ebLlNLrs=Uel;RF} z&)K%fchM1^3Nt>NOL2*kPQp{mZltQ8-v8Er{*&{kOLyA!Hvd>Kqw2lLnJys~%eTJo zqgdIu`Jdkqr@P%m;d$?suZo>Dk0v$sS?=+gS>mp|>=1iVWm2uo#A4}a$$Vj*;Su^8BBT{f57NtdzJc5tY|ll`2swRe{Hbu9O@FAV#qx0&5`)mx^`kM8U-DYZO4d)^$I#ILNd&;jM% z&F9&)89Cv(crr7G3DeaTlPx)9Y+gXJa&bvzPHHhIBL{dhGKnxC@;xZ=&jbe8Hx32{ z37}#G=$$-~Lmiw!Kw&@m0Ed`W3=0E8d{JsnvA!ONL^lgH0uUxKFsz*{z^MsxlQpLd V(>}Jz_t``z=Wzk~WMZ=8zoJNf*vL-e-0vay*a&%=(N{QgK< z*_z8#N1Tg=&3P^Nb*W=1_TLI}R;}C4KvQ*x}n%n~ zYUA%Yj2s}JckSqAoIIb&s9wLzLuB*LihBoB(%C{!Hq6?lC11bP$o#Iut>Cq_|M>T} z9X?zWIi1zQP_Z~pS3ypZBVy_&o%Lnh6(Q03EvGBu+|%{!p3XC5Em<%raBoBPQof1r zPnVoO<ks<)>2J}B@Be(~ZK-@TV|nhpTTlMZ@1BvpPfaV+tZ9B@ zM%NkTS@X{ecuc;ucZtxm2O|49>lXM3t!QYw zX&bX6OSMF`#*GIGhfJItw~Nhu@$~Dwq#l9#SIZVzziPY6Wn+8bQsa$I(`gn7p7v!n z0@mA(1+nYAJ?_Vrw9>TfO@r+B{rGZW}uvvDD_*_-1@CO+P2*KW;hF8k*2JH4PZ!+H6}1bgv3;rnrW@A=$)vf_u8 zzKF2H28FfD9%n3Fe~ItaYjvMLtgt9!04L9_%u1g(=dnmL3K*EBrlq8$m>QW`7?`A_ znopj|D#rbJH!ybHbGU zn@e9ztZH558hFH^U2iT&or=8Nf$!J1fBk0F`^HC+@0?bI2$MwQ+gk_AxcpAqtV!4% z`99;w6!RqeA16L__HzB2@<;f2;CGWmojK~W)sMAu2In~+w|%8tc4WF!h|L}2gtT)h zzh^JsFEH1zd0F~$f8m>7xMv(Mk=A6oo%}*W^TG9x*4jqgH@sITgv(CTO$rWQn)77g zwF5u)bH>J49Gj~nD5o&1m8L>?3l;M5Jw#VO1T47|Xci~z4E2Xe@O)qv9cOrV-?91IK+2n9gagvmV| z>JcDwKtZknR0G1?C~D$a7#QM1EMGaM+8vAUZ6%P6pb4ub8~8f f9dJ``{=;8Dxd diff --git a/Examples/example4.xlsx b/Examples/example4.xlsx index 510d630132fa3785e262562e83ba5755bb6d6b86..08de8cb4bcfcc14172a291d66b726fdafc85a58f 100644 GIT binary patch delta 1068 zcmZn`ZWa~_@MdNaVPN3kV7R&>J^0bSs{0d#)ayC>nO5D}v|+;`@g-}Wm1phfV*c`( z^ZnGfKW=S0r@L+O>!YH~(VtY$EaPJN)fV;IUo~dY%$$U1(d4?t1?xJ`Dc!9;cU)+f zM0<=^o>j@L<+0Q%J zY_6T%;?QzO&Bj9Knq=C{i>Jd@FI|;gF}tPS=Y+)V2Ys`;o#o@T7^`K2v){crppX)J zVt&{m|HrTRkbSZ7%VI`OkY^q%e!Dk&@&YE+dPo1m3L@+u);oQO;okCk*RgXiddzKS zRvhcSc`QgQA^PvPpqwkZ#noS2H2>Pytry?1^KD9VnbYj3t*XnevnXHGySggxzW1K3 zuQiTu|2%u$4eh^)T8cVFjn_nCJGHaTU1escs;Zb@&r*)szAY@O==HK+wr0}0KTaJ_ z5jJ+(6!EEk*U{R8OS8@xC`Ep+PFAUWe!O*ue%FP?pL zoX1;fW;CDYr;3XFf3ruoYaUGdF1+@e$9MUky1$NF_w@Mhj5?OJf5UA1TD_3XQ{Ng- zf7JEuY1w_(`l9dCi{FIg63}#bHs$08W6) zR`>62E@Y8r6i7@qwKPsNNwY{yvox_Zv6wuERZa*Lt-aHl?QSzLFzjVyV31;%EWjyK zzjdNv-eChC*Y!#T>z7_BQxXr{l=4#Q2~&^HO}8A+2~$igqub?HhOdYcapfs_ajElx z`p*vx`}Xf!yZw4*ia1wcLD<1X0tZfHUFX{tT;TW2@le_3dzU*j^N-YhnD|s!TJ($N zPxW()-(?<(u<$qY@8K3+cBiec`ilCS4tuVRPabB>V=Pv)zGL&Z^+k`Q$=f-0{wbIB z6XY)EF5!67uyFB`hWO*}*PPHvIKQ@O?-X7y&1tDCXM3%eO89fXB`(I|=sb>aRe(Zr@_r66t2h=0hWMh?oML@F5E_SU;JcQxjx?6{jZv D?TX+x delta 1068 zcmZn`ZWa~_@MdNaVPN3kU|8Ik9(>c-pLe2=dVMA%Yvvz9immw=ab0o7S>xcWyR1o>(@? zer?PAV`pWNeX;S&Vn$AoXR1|xO`bD(0h4OIZ~h?#3HA@`oo?KmD!z7W;PkVp+ux>a zG7i3ywp7C5?Y_Sn*>_C*YcGUON73~<)=Qq9(GIP;h!sOgm;?;={WmL zu%bw?!T#ieb^L9Uz4-Mp?O+K6~>pPBH?Q2x@c>4#dcch4=2+WTMUS7p(p z^xS!+XFi*qPyTc=UwPr#^oK6ShQAtoJ_p`dR9SQ6MB9}0sdG8Gf4_Wv-DkRW=w43M z_Zh)?|AW8GsNOX~cyqkXU&zt-BWaP%3Yh-sVv#aN~_-|b7#qm@Aj8n=@ zHi^V7?wS2dif28W@?2$a-ZKN^Zj;S=&loS5a{s+JRZoCz9ym7APk$aJhsRtV;hWdTqCR*V2Y-!uss;$c%m+cYUeb0TGe~!q7 zrBCh)EPjmrh5N4^;77uaXRxdpRyg5zql_-Ue>;4RVsCI zS^NQs%ef0U-Y7VGdoskezh84gC&5}b!GCLvPR23mOIhc%nR)*EzIb%Vu*@a%)feIP zr{{z0US3VTsh($ diff --git a/Examples/example5.xlsx b/Examples/example5.xlsx index a0a075d8a65c26a3c96c2dfd2c7dc22593a7791f..b83aca1a42d1f668830bbc74b45d8ae560ee94c0 100644 GIT binary patch delta 1254 zcmca1eoMSQz?+#xgn@yBgW>9m^xzE>)-1Zkz`(GMk%569NLS?Om**E{C*|j7>s93D zY@M(>@2~-nYrX4(dnfu;>JB;We60hJLqH{!u*E93) lYF0S<6?i|--@#LMs z?TNJu_}gOGe`+ze`AsrtSe%Z%3khSv4r`|cC~}i zcXL`aJ}uMfKD*0})tvvoIRB+v9yMx}+g>~hJ@Qy1X_qBW8rOjz`IEo5cFXH^=IiZx zHT9Ki@YCM7@TGs)#YO-9UC{FV{`>t5$N{lgh;cC^2Pi-Z8()K!p9n z`b#D0OLRLNTsH5lxOXrmoh|f4!>nyu^7TuF%*_k^{kDGlE5E<(aPq#K*IcqYLzZR; z`KYrf-%C-_pB>x8U-i1BV&{zQA3aa_hZd}x$Z4XLCmfTpw?8&Km34ivsbKZJ8JpKm zC|z|n>|M;(={9F`*Q|?i^LTJA^Je{nb%|aGdt71<<0g9e_m~TxYo_Tyyy9WpG)P$ zr_>7=@uX}sd!H?tcxB-g#e;1ZXRvJi&ws5sQBvgev4rIgYxoaW1*|b=d(FHtSmIiH z(qF>}{tn)R8=4~4vdyUuZ+O~x7u-nTnZ~qHk;l3@DV;yL^ReSbK^|$RjSnSs7?U&` zGnH4ENi9qj4Edd2z}wS0yJg|d4?E2Fyf=M)^@^`Df7F`OUd5d%_ob|Q!=GvWU9hj_ zkj_5TSZii^0Ex9doVVFFXR}E&3YeN3CZ;4OnI)Q~q?%Zm8cm+YF2@Oq*bGt0b+0Gy zWmm7a&N^Zs;ILll%JEO-xvf|8Cab;OBrf5te0z#x84H&^N;>s7@RSmrQj9N#R=6J^)S$uOoXY5+*pK^w4=I%Qk z_)|HBdv9AfL*=nC#&fkgoVumeSb1w(O3Wlm}_s8|T_ zW@Hj!K$Ie&OfwCr=o<$Eg9Jh!khNy=d@gmSt1Bj-;F4jgV41vtOLX#YESy039q0 AzW@LL delta 1209 zcmca5enY%Iz?+#xgn@yBgJE%Fdhi@B*5sQE3=HcS85sD1bVZJSd45rLQht86UPW%s z)(L0x4jJ$?#H)U)T@s>tq3clVX};Y#{u7q*^=3TM;)|BA*G%@gl{x*c-TxE+-ux~6 zwz%T>i9RRp*P)C|%?t0f7IR-unO|05^XB=p=0{7FcXia?k>4>hS|Vtcl;%yI7pCho z4o%3Ow&=QM`$wJ1t`*gC0+Z!aBSpNb-ZJTY&Wo&@z;P>?Ti-kKj?wwrYm9=@(;tdX z-FQ1{;i0p;R{3(4_x}**-*ipVX5!8&o|oP#k5&Zlo5^l&$no>`liY`Uo;{rO^Ig!& zyJ@RS(|2!Lx5n`Q10|7qxhWrie{c6k4u{RcjEfmLK;gl6%;4(eeN1Zg=kuEkMA$#n zFMWB=tDZqg@a(fkmF$z}&J0s!_PW*e=co469WRgASYEyLy|zY*um9#E&7u(QrN)tJ zGx|8)7Tr0K8}?4P#$eA;rUB`U1L||+0+HNHH*KF2Kef8=oBN5p)+fu3N13qgwK15-{Cs-U zdChvoCGsa?-fml++Hz5Fsj|?zOo?E*$sY`-9p1pxmFm2KQQ-CA4KiI%oj2GCNFUf> zC-R#AV3C4ZOCqy|nM6~n!yA@1-i0>`IHoae6y&jPOj7qxKH1^CF<8Q^DQU4{1k;fq zrptZ{Z@pyDo$a*sKU?_uh#lT9W^h<1PhYbWA)+?pOpElbhGgaee$>rP=tRj^uvu{kAFvZL=THH2heSoOb#)aK^ zT(P{Lt8LnTR#e}AxBjzBoWYTck({A{OpdE#&2PmWQk~h(`= z+Lo8>2E8xM5?P8u79Lk=j9Xs4_JoeY`ME948Cqu}uXg#F_+;|7{F`}UHTQE1g=JeW zms@Jrw`MJDkC`1-@Z?5_&x>F3FRpUi9y9k{edXkwtb=F%R+W5J-i?yN(}S;E`=t6G zn8P%E@MdHZVL+4?pxiMH zsOTF91A_$6ECg6Rc_EiN$edGLGK}SupL40pgF+n?F&aP(Ak2+W4P-@5*5#H$ikSdz cQN~r1)3`N3hD_v^VLUT=9k&|WA5M@i028MP-2eap diff --git a/Examples/example6.xlsx b/Examples/example6.xlsx index 0cee9e2ec65e3f26b009fc99737604ef776c46e3..961ba99a9c3673c9e4746adff649b8142e0e23c7 100644 GIT binary patch delta 2562 zcmZ`*3pf+%8{gb7xr9z?7^e&+q?tCiF8J6tSt65d zcNn-`z3mkYnBL=b5DCO=h{`Zb^y{JD->!5_rzX7?XnR{Re6|gf`Hn1<-H?&(Zqobb zg-ec-zi!~?Ca8y%CW>j!MI@GgLLS2JsB0;6sJ~gL*g`E&tTUf6*TMuy^dEFTe}6FN zkhjNvdP?TH$uqKBx64KAwmuYBqOWWfidMZml&@8Ev1G>aX+s&>uhOa0OD$=S&<~WB z8FcMH%aV)y;RiXv+6L_7x=SY%JJ<^aVU_IC7u7Rk9&#R^GsBD$!tbv|cvOe{;04>U z69J8#m@M{xz1l+jB$i(%{WCdiePAh2ZYxPSP(UhUNCH9|#wVL;$V~ZQTCg_`oOhOD z-w{bcTG5Cr83>;DjL>Ia6wk@;4Rq zbPu`cA@k+l$5$t!@RyZFj$#mPhtS2M_Mi{Veap`Clt?}daba9=b5tB(OAczztE4(P zzr5I19Yym$cVPcBx^vDP`=AKV3E>* zY@iJp^5L^qxAvm7CB@3)W9q5a`_?5KYL9bkPE8q|sMw3st4gWdzI@jIE!l*8zil~O zz!@m9RSyWG8f-|Tn~+4$vpt}cp!kN_yK5luA)2ckrTPq>FgzEQ`gGOKTCGMC?wphQ z87ZlmYtO>T#ck_OH^TvXWE|`CRISocj)pL;WTl@4a_QQRtZ6-8nQnKaK<+nsI?_lL z)K#Z$821sHO9pCKrJ+I%VLHkBcE1L0VtcFh zLkhte0l8P6D;Tx2VwlG7JzClm*GliV1HaYn$!5KX+!k*}kraeBi7znI=oR|dzh}OP z7O5vQPhrb#?8^e#-IyW3iAKhP$U-XC?T<2B>JM^Si}qO`uYilijq-zt0>9X*%R0w3 z`|wq9v8#;=KgEG}Jm-m7rlzi+VX{V%Q!+3srY6LwR=IBpqUrdUlUfXV_L`u zJuVzInL3|dHprK@MHhYebD;wbTMf@H$S3FgCH?A8Bu$9<-RJ4p)R^{M?35T(%-@?T z>d5X*An`cHdEb{fzpVYStna~+A}$%VtEXNCCdo2Nho8i~NP*kq(ovoo1!APSYC))A zTMydCSB9myt)NseF6*Y-c(+bbqcxAd!y`H5s%E1dD^11wXJ56vxC;?ib^L-#{3O`A zuVPT`v?e>wS?-A$_?XIN3ZCBR`>DRmqL5nlVtyWLkhK>RAU$uGWxV< z_>z+v>CgT323TRWggyIi!aNN)$&ly)LvM45bk4?|PZG>Q!GIt$HdPM0sHR?gcba!+ zT)MX{>W9FGjubQ0WuL0}z*B_9g(=HYjHrQptfHc2ZLX0rpAvVS_=ci`=S)_3y!0Mx z8yI)w{8_akD985?G_^kTf4KrLs-dm3h&%7)?cK*NQD~L+Ssn~*vOgWeS57gvS{?Ib zt&CC5!(RE!e{y@iUh5+}`|jiH46+scY+(AR%1j$)a7=G;xESHYbk@dC!+sC(Os66mtlicO`lit5*yEKgm>!*4L7B_Z%!lEfO?!>_H#5c6ydm=5I z&4DFmapJ<9`&`)6M-X^tNX8mXUmVTnN27H2WM#Po>D_dBB)aJPpeLE028sKT%MGXw z3$1~`AfdehxB)Jg>FdUY1ia6qYhy#~x$ez^R5~2Wa^Sk(5y*qAc4=Xqa_QHiSe~%B zTNf%ph;1o|ih)!Uf7P?sVvcG~h~pS2B)t7==LbCBsV9 z__-8yzS|;X_hjm_(hb7(#CLxs{kmG;{>ze517S!6sU{$cM?|y}7IZ?VSmu%CP`mwf zLES%&brU7$K+tyicOd6UyLFlW2h07BJ+$wn@tcCOO)rD#t4YuOTRD^qOl|50;yraj z3f_+4=?6A85feX%g--E8<*&C9AP?Aju+-L&E9~>~AfRQ)k;6xz=z}Or=ot$r^o-^A zx~4YAOc7x?R1AiIk3Nez7j5&EEcb<*=nR4|gSzx`7Ub3xT!?YCe!)o=NIj*1=jUt$PM|u2EdIzmwd-KtEWDjpM~1 z&jr=d!X94tha7o^{-ij3dJIb?ip^hWBmobB@sjbb?sW~C5&gHjNCz$$yB5LWna8j> z5|S98({4i})Mv=j+g$bs)vhORDzvV2IJ7)+A?~X?|-*vd{O2 z5d8_wL5+`iZBv-6DhKDww=%%m%Ys*FtHmeX6u#=3CzWjJZ5BZJ|LPltqY_l&aV3MI zq;(7g{33FqV<@<==q-tJ(hVq~0r;kfwm$p3O^~!a0HC?4h`zPEjA11Mxvw8gw(@tt zON^b$2H>roFAvJ5hU)q5e_0P1fyxHHU#o1mX?d$FelxqdB5nE#CWhgnO-;7Oe}=S0 v{8Hjg*!re}-Txx?F~*gRz65ZBdgPkarr`)l06_g;m<`5W6^M+v($?nR=CYFU delta 2501 zcmbVOc|6qX8XuD|G?q*ZQ^t~!Vn&E85t6c$r7RIMwlNLkBu3Vsk%)$3!p(5vRI-&B z`_|Agk?bScQk^0dVvdQiU%L0)&b@!$_mB5|KJVxIJkR@ip6By^zpoVf6aagh9fB|r zNJIp5pMrN9j_&Q60f9iqU=T=R>%1C>2@eh-dItv+(N}{4pK_R_Rz*pn_bz6&`f%HQ zm!5ZUREdMKE&Lk}yIhaUo5m7y3grw#3ALNz39JF;h$cxn7*2z-cGQ%_B5l4S${&WlESKF8t~xFQt?GY_?2JXt!WDV#Z{s@DjM&|A zId73ypPxp%JZCOC6Cq>kq;EpTSGH z2A^pb_e|BL)G|9?5vs0$&4H?UBe7<;gd&3|?}}Job9maOPqEsZhN_q5?uc@Sl<$g> z1$Q@gh^>3NBzu|SR>l8bno2c+`vM}{C5qmS$Iv)n6fjPT*MbSpyAT?P50UYwV3qZJ zK~$r^VWS*}5e~DmeBbc< zaLhmiEjM#RTUbdWgz|EKHyBxV3}uF`5mwUCakg@(ug>FWSCUGWC&)rjSH{L@OzT(=nQ`N~j!JZ|(5Hy( zsosfe_pb4MSa?06+J(GylK!$)RdzXC?p{bWbuhNzj7y1ehiJc4kj-Fr{7{!Wkhq@h z_8rf+L(Ox%uw)5T_;tPCn4ce7ML|4Rm-7He^A|p<3sDOsj7ry2VMFEq#FLOoNb(AE zZ=#>Q1|l9x8HViYEO0duG!pQ(fRn+`&m>|EBoWUTN-%`@Gi^n(XzNM)KwUu_$}l`J z&zw2%i0R8N7?#_GuwZf}H3YoXDFnRzY+zhgcmAkp%#4{kKYP9iV?39-`jpgki17PJ zM@g8&g@SY$BdbRpFZVs19vd>v;UWIsH@wr0mam1hd_fe@PoitV6aR2$4j+Er3{A*K z4dxWP*b~|{F3an-q|fg6h=rPsI|hA8x+Ow+XMDiXbD3Klj37I=y>4)~bl!W#*$Jb9^k=7!kD$dlJ zmdmb3gy>)jBczUE9z_`7O_mpwKN2^JJdWhTV{ra;glP6WH;O%TbaJSohbr4Mok}_r z)PBOY)p2S%9;ws2gl9MV>n-6Yx^1AaW-wy@R#+}UgC$`O)vGf zsPKWO@nR{--oG|GdS+-u#3BzJE<4Ut7Nk>#VXfA%LlzA68{JxgDc%E;Wr9qD#BTdQ znfN`5WD4#IjGlyruw~$6innYf(>Ut@IT6#MfEvk=NHY^;YU=lwqa?bn|yf9eYdr$=qBH(hULldp6f;XilWJG>_$m(w+#OGp3Hin zNaD$*TS3!>T^5aFO{k5&y66GmR_5vn>S>xbrlijOmy2`jL5NJt@Y$mW7i^l3$PS5rk_&V0r6 z$E?X)vF=?O`m^ARL~d4TB%o3HBCSs|tO3o}TbSLTt`YsifHoHW^a=-Pj-T{lEHnCU zHYR-T%p09<`L1uGiK8w94|!80(o~8RH7@(r9v5TiOw37S*nP7=keBXN$@iO?o@&=?${usd<-~PI_d+qpztN2%{-)eBg|& zH1UNi{0X_|b zJ#YU?5rX>IVLCCVILGOU$%WZ_;14e4yIGWc@skpQAOc463+!A+kBj#8NJJ&8g zOP+ohaji|C!Ge6D_p!o&=GG{;cL_YZfOjW8B3$1k#5jIL0)x6N%6Gd{?-Ca6{y(cb zg9VwT2Sn?X1!wWPIa_(~tx=}j$K$N1w| z8b?vk4-!5nTdY!<3_%F!YwPOc^!$$);Jp3xbaiyKl@&22#u!JxKwKyxm~l+oEb%3%68pQU03Oy2BP#KP27}!>%zN4`T(E4c(Izid_yo zE_s<{7+QP>!i{T=-7!}lOdk)E?~uzwmKCd?b+qm~FeYAD`bGV7QpUF$`mr=^HiCup zKl?%YBXKlI%k=Q4^S5Zce`@nN?*_u~XQ%>R_mSWHYPgqw2 zzhAFK{-}uXzco!IWY-Y^$bYmA%?hduzE7dWK=%sB(Q=@Be{wntDg$PLX>Y*tw0Y<* z