<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>xlsgen, native Excel generator</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><description>Blog for xlsgen, native Excel generator</description><copyright>ARsT design</copyright><managingEditor></managingEditor><ttl>1440</ttl><image><url>http://xlsgen.arstdesign.com/xlsgensmall.jpg</url></image><item><title>xlsgen 3.0 build #17 : Validation against Microsoft Office BFF file validator</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Tue, 7 Feb 2012 17:07:00 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.17 of xlsgen adds 4 fixes for validating XLS files against the Microsoft Office BFF file validator.&lt;br&gt;&lt;br&gt;In addition to Excel 2010 file check on open, also recently added to previous Excel versions as part of service packs, Microsoft has been working on another deep file format validator for XLS files, which is &lt;a href=&quot;http://www.microsoft.com/download/en/details.aspx?id=26794&quot;&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;The important changes to ensure that xlsgen generated XLS files are successfully passing the test are included in this build.&lt;br&gt;&lt;br&gt;So whenever this validator becomes part of Excel, xlsgen is already ready for it.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #16 : Text reading-order</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Fri, 3 Feb 2012 08:59:37 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.16 of xlsgen adds read/write support for text reading-order in XLS and XLSX files.&lt;br&gt;&lt;br&gt;Text reading-order is relevant in far east languages.&lt;br&gt;&lt;br&gt;A new enumeration is created :&lt;br&gt;&lt;br&gt;	typedef enum&lt;br&gt;	{&lt;br&gt;		[helpstring(&quot;Text reading order, context&quot;)]         textreadingorder_context        = 0,&lt;br&gt;		[helpstring(&quot;Text reading order, left to right&quot;)]   textreadingorder_left_to_right  = 1,&lt;br&gt;		[helpstring(&quot;Text reading order, right to left&quot;)]   textreadingorder_right_to_left  = 2&lt;br&gt;	} enumTextReadingOrder;&lt;br&gt;&lt;br&gt;&lt;br&gt;And the property is exposed at several levels :&lt;br&gt;&lt;br&gt;- style : Alignment.ReadingOrder property (IXlsAlignment interface)&lt;br&gt;- chart text elements : Options.Alignment.ReadingOrder property (IXlsChartAlignment interface)&lt;br&gt;&lt;br&gt;Also the property is exposed in html cells, as in &amp;lt;b rtl=true&amp;gt;data&amp;lt;/b&amp;gt;.&lt;br&gt;&lt;br&gt;Also the automatic source code generator outputs the corresponding source code, when used.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #15 : More conditional formattings</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Mon, 16 Jan 2012 09:44:12 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.15 of xlsgen adds more conditional formattings to XLSX files.&lt;br&gt;&lt;br&gt;They are as follows :&lt;br&gt;- top values : for instance highlights the top 5 values&lt;br&gt;- bottom values&lt;br&gt;- top values in percent : for instance highlights the top 10% values&lt;br&gt;- bottom values in percent&lt;br&gt;- above or below average : with several average variants&lt;br&gt;- duplicate values : for instance highlights values that are duplicates&lt;br&gt;- unique values : for instance highlights values that are unique&lt;br&gt;&lt;br&gt;Trying to create such conditional formattings in XLS files will return error messages. The reason why is that they are new in the XLSX file format.&lt;br&gt;&lt;br&gt;Here is how you get to highlight unique values in a set :&lt;br&gt;&lt;br&gt;// create a style&lt;br&gt;IXlsStyle s = worksheet.NewStyle();&lt;br&gt;s.Pattern.BackgroundColor = 0xCCFFCC;&lt;br&gt;&lt;br&gt;// highlights unique values in column B using style s&lt;br&gt;IXlsConditionalFormatting cf = worksheet.NewRange(&quot;B:B&quot;).NewConditionalFormatting();&lt;br&gt;cf.PredefinedCondition.UniqueValues();&lt;br&gt;cf.Style = s;&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #14 : Fix for editing hyperlinks</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Tue, 10 Jan 2012 22:03:10 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.14 of xlsgen has a fix related to editing existing hyperlinks in XLSX files.&lt;br&gt;&lt;br&gt;Before that build, changes to existing hyperlinks would be ignored when it caming to writing the XLSX files.&lt;br&gt;&lt;br&gt;No source code change needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #13 : Fix for chart axis crossing</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Thu, 5 Jan 2012 10:01:32 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.13 of xlsgen has a fix related to chart axis crossing values in XLSX files (Excel 2007/2010).&lt;br&gt;&lt;br&gt;xlsgen did not write the value at which an axis could cross the alternate axis in the case of XY charts (scatter, bubbles).&lt;br&gt;&lt;br&gt;This fix also reads the value from existing charts (all charts) from XLSX files. And also exposes the value in the automatic source code generation tool.&lt;br&gt;&lt;br&gt;No source code change needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #12 : Fix for overlapping shared formulas</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Tue, 20 Dec 2011 21:59:48 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.12 of xlsgen fixes a problem to shared formulas overlapping one onto others.&lt;br&gt;&lt;br&gt;The shared formulas is a mechanism in Excel meant to optimize the storing of formulas. A use case that was never seen before, considered valid by Excel, is the overlapping of two shared formulas areas. xlsgen could be disturbed by this and corrupt the formulas in the overlap.&lt;br&gt;&lt;br&gt;This build fixes the problem in question.&lt;br&gt;&lt;br&gt;No source code change needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #11 : Fix for wrapped cells in print/preview/PDF</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Thu, 15 Dec 2011 14:40:46 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.11 of xlsgen has a fix related to the handling of vertical alignment in cells when doing a print/preview/PDF.&lt;br&gt;&lt;br&gt;The change is related to the ignoring of the vertical alignment setting whenever the cell is both marked as wrapped and left aligned horizontally.&lt;br&gt;&lt;br&gt;xlsgen does not ignore the vertical alignment anymore.&lt;br&gt;&lt;br&gt;No source code changes needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #10 : Table subtotals</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Sat, 10 Dec 2011 23:44:16 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.10 of xlsgen introduces another &lt;a href=&quot;http://xlsgen.arstdesign.com/core/businessintelligence.html&quot;&gt;business intelligence&lt;/a&gt; feature : table subtotals.&lt;br&gt;&lt;br&gt;Continuing last build, which introduced table breaks, this time xlsgen adds the ability to compute subtotals.&lt;br&gt;&lt;br&gt;It is a straight-forward feature. The ability to aggregate data along a numeric axis.&lt;br&gt;&lt;br&gt;The aggregate function lets one customize the process. Among the functions are : sum, min, max, average and count.&lt;br&gt;&lt;br&gt;And here is how it looks like :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks7.gif&quot;&gt;&lt;br&gt;&lt;i&gt;Table subtotals&lt;/i&gt;&lt;br&gt;&lt;br&gt;Internally, xlsgen does build actual Excel formulas, computes them and put their results in cells in the footer of each break.&lt;br&gt;&lt;br&gt;Here is how to produce the subtotals :&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;worksheet.Tables.InferFromWorksheet()&lt;br&gt;IXlsTableBreaks pb = worksheet.Tables.Item(1).DataResults.Columns.ItemByName(&quot;City&quot;).Breaks&lt;br&gt;pb.DistinctValues()&lt;br&gt;&lt;br&gt;IXlsTableColumn tcSales = worksheet.Tables.Item(1).DataResults.Columns.ItemByName(&quot;Sales index&quot;)&lt;br&gt;&lt;br&gt;IXlsTableSubtotal sts = pb.Subtotals.Add(tcSales)&lt;br&gt;sts.BuiltinFunction = xlsgen.enumSubtotalFunction.subtotalfunc_min&lt;br&gt;sts.Label = &quot;min = &quot;&lt;br&gt;&lt;br&gt;IXlsTableSubtotal stm = pb.Subtotals.Add(tcSales)&lt;br&gt;stm.BuiltinFunction = xlsgen.enumSubtotalFunction.subtotalfunc_max&lt;br&gt;stm.Label = &quot;max = &quot;&lt;br&gt;&lt;br&gt;pb.Apply()&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #9 : Table breaks</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Thu, 1 Dec 2011 08:29:00 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.9 of xlsgen introduces table breaks, a new capability.&lt;br&gt;&lt;br&gt;&lt;br&gt;xlsgen business intelligence features include the ability to break tables in sections according to criterias.&lt;br&gt;&lt;br&gt;The most obvious criteria is distinct values, which is straight forward on columns whose data type is a string. This mechanism allows to break on every other value, and create a section accordingly making it easier to understand the actual data.&lt;br&gt;&lt;br&gt;The other criteria is a generic formula.&lt;br&gt;&lt;br&gt;The capabilities are exposed in the &lt;a href=&quot;http://xlsgen.arstdesign.com/reference/IXlsTableBreaks.html&quot;&gt;IXlsTableBreaks&lt;/a&gt; interface.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;H3&gt;Breaking on distinct values&lt;/H3&gt;&lt;br&gt;&lt;br&gt;Here is the raw data we are working with :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks1.gif&quot; border=1&gt;&lt;br&gt;&lt;i&gt;Data before applying breaks&lt;/i&gt;&lt;br&gt;&lt;br&gt;The &lt;i&gt;City&lt;/i&gt; column has a set of two distinct values : {Rockwell, Marver}. By breaking on distinct values, &lt;span class=&quot;xlsgen&quot;&gt;xlsgen&lt;/span&gt; creates the corresponding sections.&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;worksheet.Tables.InferFromWorksheet()&lt;br&gt;IXlsTableBreaks pb = worksheet.Tables.Item(1).DataResults.Columns.ItemByName(&quot;City&quot;).Breaks&lt;br&gt;pb.DistinctValues()&lt;br&gt;pb.Apply()&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;And the following result is obtained :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks2.gif&quot; border=1&gt;&lt;br&gt;&lt;i&gt;Breaking on distinct values&lt;/i&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;H3&gt;Breaking on a generic formula&lt;/H3&gt;&lt;br&gt;&lt;br&gt;Whenever the criteria to break the table is more complex than just distinct values, &lt;span class=&quot;xlsgen&quot;&gt;xlsgen&lt;/span&gt; exposes a generic formula mechanism, which can use one or more column names and any Excel formula. An example follows :&lt;br&gt;&lt;br&gt;In the first example, the data we have is a capture from For(eign)Ex(change) currency data, which is a time series capturing forex data from 3:00 PM to 5:30 PM on a particular day, on a per minute basis.&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks3.gif&quot; border=1&gt;&lt;br&gt;&lt;i&gt;Data before applying breaks&lt;/i&gt;&lt;br&gt;&lt;br&gt;We may be interested in breaking all transactions per hour, therefore break on the &lt;i&gt;Time&lt;/i&gt; column according to a criteria involving the HOUR() function :&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;worksheet.Tables.InferFromWorksheet()&lt;br&gt;IXlsTableBreaks pb = worksheet.Tables.Item(1).DataResults.Columns.ItemByName(&quot;Time&quot;).Breaks&lt;br&gt;pb.Formula = &quot;=HOUR([Time])&quot;&lt;br&gt;pb.Apply()&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Doing so we obtain 3 breaks, one for the time period [3:00-3:59], one for [4:00-4:59] and one for [5:00-5:59].&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks4.gif&quot; border=1&gt;&lt;br&gt;&lt;i&gt;Breaking on a generic formula, =HOUR([Time])&lt;/i&gt;&lt;br&gt;&lt;br&gt;In the second example, the generic formula mechanism can be used to enforce predefined value ranges. For instance, we have a &lt;i&gt;Sales index&lt;/i&gt; column where the data is between 0 and 100, and we would like to put all values in the [0-80] range in a particular bucket and everything above 80 in another bucket.&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks5.gif&quot; border=1&gt;&lt;br&gt;&lt;i&gt;Data before applying breaks&lt;/i&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;worksheet.Tables.InferFromWorksheet()&lt;br&gt;IXlsTableBreaks pb = worksheet.Tables.Item(1).DataResults.Columns.ItemByName(&quot;Sales index&quot;).Breaks&lt;br&gt;pb.Formula = &quot;=IF([Sales index] &amp;gt; 80; 2; 1)&quot;&lt;br&gt;pb.Apply()&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;And the following result is obtained :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/tablebreaks6.gif&quot; border=1&gt;&lt;br&gt;&lt;i&gt;Breaking on distinct value ranges (inside [0-80], and above 80)&lt;/i&gt;&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #8 : Fix pack</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Mon, 21 Nov 2011 19:29:49 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.8 of xlsgen brings a fix pack with the following relevant changes :&lt;br&gt;&lt;br&gt;- sheet names to be enclosed in quotes in XLSX files whenever the names look like cell references, as in 'T1'!A1&lt;br&gt;- do not write alignment properties in conditional formattings in XLSX files since Excel 2007/2010 complains about it (there is no Alignment tab in Excel for conditional formattings)&lt;br&gt;- unary -- in formulas (i.e. better handling of case with multiple unary operators)&lt;br&gt;- table inference internal headers better inferred (cas with date versus time)&lt;br&gt;&lt;br&gt;No source code change needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #7 : Fix for IEEE values in formulas</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Thu, 17 Nov 2011 08:48:13 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.7 of xlsgen has a fix for IEEE values in exponential form in formulas from XLSX files.&lt;br&gt;&lt;br&gt;IEEE values in exponential form are : +-dddd(.)dddddE+-cccc. An example is : 2.5E-12&lt;br&gt;&lt;br&gt;No source code change needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #6 : Fix pack</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Fri, 11 Nov 2011 10:51:19 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.6 of xlsgen is a fix pack. It contains the following :&lt;br&gt;&lt;br&gt;- CSV import : better auto-discovery feature of headers&lt;br&gt;- XLSX writing : handling of custom part names (written by tools other than Excel)&lt;br&gt;- Additional Page setup properties duplicated with worksheet duplication&lt;br&gt;- New sample code : &quot;business intelligence&quot;&lt;br&gt;- Fix for table inference&lt;br&gt;- Support for secondary Y chart axis in XLSX reading scenarios&lt;br&gt;- Support for alternate chart types in XLSX reading scenarios&lt;br&gt;- Print preview scale now create a better PDF (no flatten print area)&lt;br&gt;- Fix for reading XLS files created by Crystal Reports&lt;br&gt;- Preserve the scrollbar position per sheet when reading/writing XLSX files&lt;br&gt;- Fix for nested sorting (business intelligence API)&lt;br&gt;- Workaround for the bogus DrawText() WIN32 API calls, used for rendering text&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #5 : Advanced CSV import (II)</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Wed, 2 Nov 2011 09:42:00 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.5 of xlsgen adds more capabilities and continues what was introduced in build 3.0.0.4&lt;br&gt;&lt;br&gt;This time the new feature is the conditional import formula.&lt;br&gt;&lt;br&gt;It's the ability to set up  a formula that governs if rows will be imported or not.&lt;br&gt;&lt;br&gt;For instance, let's say we have the following CSV file :&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;---------- datasource.csv ----------&lt;br&gt;ID;DESCRIPTION;DATE;PRICE&lt;br&gt;45;description1;10/06/2006;10,2&lt;br&gt;12;description2;11/06/2006;5,25&lt;br&gt;32;description3;12/06/2006;6,3&lt;br&gt;86;description4;13/06/2006;9,99&lt;br&gt;74;description5;14/06/2006;4,45&lt;br&gt;29;description6;15/06/2006;8,5&lt;br&gt;31;description7;16/06/2006;7&lt;br&gt;56;description8;17/06/2006;11,5&lt;br&gt;52;description9;18/06/2006;11&lt;br&gt;---------- datasource.csv ----------&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Assuming we would like to import only the rows where the ID is greater than 50, then having identified that the ID column is the first column, we can do this (C++ below) :&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;xlsgen::IXlsWorksheetPtr wksht = wbk-&amp;gt;AddWorksheet( &quot;Sheet1&quot; );&lt;br&gt;&lt;br&gt;wksht-&amp;gt;Import-&amp;gt;CSV-&amp;gt;Options-&amp;gt;ColumnConditionalImportFormulaByIndex[1] = L&quot;=CELL(\&quot;contents\&quot;) &amp;gt; 50&quot;;&lt;br&gt;&lt;br&gt;wksht-&amp;gt;Import-&amp;gt;CSV-&amp;gt;ImportFile(L&quot;input\\datasource.csv&quot;);&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;And the resulting sheet contains the following :&lt;br&gt;&lt;br&gt;&lt;table border=1&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;ID&lt;/td&gt;&lt;td&gt;DESCRIPTION&lt;/td&gt;&lt;td&gt;DATE&lt;/td&gt;&lt;td&gt;PRICE&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;86&lt;/td&gt;&lt;td&gt;description4&lt;/td&gt;&lt;td&gt;38881&lt;/td&gt;&lt;td&gt;9,99&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;74&lt;/td&gt;&lt;td&gt;description5&lt;/td&gt;&lt;td&gt;38882&lt;/td&gt;&lt;td&gt;4,45&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;description8&lt;/td&gt;&lt;td&gt;38885&lt;/td&gt;&lt;td&gt;11,5&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;52&lt;/td&gt;&lt;td&gt;description9&lt;/td&gt;&lt;td&gt;38886&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #4 : Advanced CSV import</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Tue, 25 Oct 2011 10:02:26 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.4 of xlsgen adds advanced CSV import capabilities. What is introduced is the ability to specify custom data import mapping in order to ease the import of data. An example speaks best.&lt;br&gt;&lt;br&gt;Assuming we would like to import the following data in an Excel file using xlsgen (the EUR/USD ticks are taken from a trading tool) :&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;---- EURUSD_ticks.csv excerpt -----------------------------------------------&lt;br&gt;2011.10.25,03:00,1.39076,1.39092,1.39060,1.39061,41&lt;br&gt;2011.10.25,03:01,1.39062,1.39070,1.39029,1.39033,37&lt;br&gt;2011.10.25,03:02,1.39031,1.39044,1.39015,1.39042,55&lt;br&gt;2011.10.25,03:03,1.39040,1.39040,1.38997,1.38997,51&lt;br&gt;2011.10.25,03:04,1.38997,1.39028,1.38997,1.39018,48&lt;br&gt;2011.10.25,03:05,1.39017,1.39034,1.39009,1.39016,41&lt;br&gt;2011.10.25,03:06,1.39020,1.39025,1.39001,1.39009,55&lt;br&gt;2011.10.25,03:07,1.39017,1.39041,1.39014,1.39037,40&lt;br&gt;2011.10.25,03:08,1.39037,1.39078,1.39037,1.39077,40&lt;br&gt;2011.10.25,03:09,1.39079,1.39112,1.39079,1.39094,94&lt;br&gt;2011.10.25,03:10,1.39095,1.39107,1.39086,1.39091,71&lt;br&gt;2011.10.25,03:11,1.39093,1.39105,1.39087,1.39102,34&lt;br&gt;2011.10.25,03:12,1.39101,1.39102,1.39075,1.39098,57&lt;br&gt;2011.10.25,03:13,1.39098,1.39102,1.39077,1.39077,21&lt;br&gt;2011.10.25,03:14,1.39076,1.39078,1.39055,1.39061,72&lt;br&gt;---- EURUSD_ticks.csv excerpt -----------------------------------------------&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;If we import EURUSD_ticks.csv as is, without custom data mapping, the resulting will not read the first column as a date, but as a raw string (notice the left alignment), therefore unable to be play its role in Excel calculations and display. The second column will be read as a time which is correct but not displayed in a human-friendly manner. Here is a screen capture of what it would look like in Excel :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/importexport1.jpg&quot;&gt;&lt;br&gt;&lt;i&gt;Importing EURUSD_ticks.csv in xlsgen with default mappings results in incorrect data&lt;/i&gt;&lt;br&gt;&lt;br&gt;By applying custom data mapping for both first and second columns, the dates are correctly imported  and time is correctly displayed :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/importexport2.jpg&quot;&gt;&lt;br&gt;&lt;i&gt;Importing EURUSD_ticks.csv in xlsgen with custom mappings results in correct data&lt;/i&gt;&lt;br&gt;&lt;br&gt;And here is the corresponding code (C++) :&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;xlsgen::IXlsEnginePtr engine( __uuidof(xlsgen::CoXlsEngine) );&lt;br&gt;&lt;br&gt;&lt;font color=green&gt;// we create a regular Excel file, and use the import interfaces&lt;/font&gt;&lt;br&gt;&lt;font color=green&gt;//  data types are custom bound&lt;/font&gt;&lt;br&gt;&lt;font color=green&gt;//  since we know the incoming data uses a particular data format&lt;/font&gt;&lt;br&gt;&lt;br&gt;xlsgen::IXlsWorkbookPtr workbook = engine-&amp;gt;New(L&quot;ResultingFile.xls&quot;);&lt;br&gt;xlsgen::IXlsWorksheetPtr wksht = workbook-&amp;gt;AddWorksheet(L&quot;Sheet1&quot;);&lt;br&gt;&lt;br&gt;xlsgen::IXlsCSVImportOptionsPtr options = wksht-&amp;gt;Import-&amp;gt;CSV-&amp;gt;Options;&lt;br&gt;options-&amp;gt;ColumnDataMappingFormatByIndex[1] = L&quot;YYYY.MM.DD&quot;;&lt;br&gt;options-&amp;gt;ColumnDataMappingFormatByIndex[2] = L&quot;HH:MM&quot;;&lt;br&gt;&lt;br&gt;wksht-&amp;gt;Import-&amp;gt;CSV-&amp;gt;ImportFile(L&quot;EURUSD_ticks.csv&quot;);&lt;br&gt;&lt;br&gt;workbook-&amp;gt;Close();&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #3 : Fix for macro 4.0 sheets</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Mon, 17 Oct 2011 09:51:11 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.3 of xlsgen fixes a problem in XLSM files embedding Macro 4.0 sheets, particularly International Macro 4.0 sheets. The corresponding markup was not supported so far.&lt;br&gt;&lt;br&gt;No source code change needed.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #2 : Performance improvements (II)</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Tue, 11 Oct 2011 11:36:32 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.2 of xlsgen continues on 3.0.0.1 and finds more performance improvements to make. No less than 40% faster in speed for reading XLSX files (the larger the files, the greater the speed change). And up to 15% in speed for writing XLS files.&lt;br&gt;&lt;br&gt;If you are making intense use of xlsgen, and were using an old version (2.9, 2.5, ...), it's an opportunity to move forward.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 build #1 : Performance improvements</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Fri, 7 Oct 2011 17:45:48 GMT</pubDate><description>&lt;br&gt;Build 3.0.0.1 makes great strides in performance. 35% less memory used for processing XLSX files. Up to 15% speed up improvement for processing XLSX files.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 has shipped!</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Wed, 7 Sep 2011 14:56:04 GMT</pubDate><description>&lt;br&gt;xlsgen 3.0 has shipped!&lt;br&gt;&lt;br&gt;A wealth of new capabilities in a number of areas. Whether you are interested in generating raw Excel files, analyzing, introspecting, calculating, reporting and now introducing Business intelligence, xlsgen comes with extreme versatility, speed on so many development platforms all at once.&lt;br&gt;&lt;br&gt;If you are using an older version of xlsgen, such as 2.9, a new license is needed.&lt;br&gt;&lt;br&gt;&lt;br&gt;What's new in 3.0?&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;br&gt;&lt;li&gt;&lt;a href=&quot;http://xlsgen.arstdesign.com/core/businessintelligence.html&quot;&gt;Business intelligence&lt;/a&gt;&lt;br&gt;&lt;li&gt;&lt;a href=&quot;http://xlsgen.arstdesign.com/core/vectorshapes.html&quot;&gt;Vector shapes&lt;/a&gt; (all basic types) and their associated formattings (lines, fills, ...)&lt;br&gt;&lt;li&gt;Data bars, color scales and icon sets. See &lt;a href=&quot;http://xlsgen.arstdesign.com/core/advancedconditionalformattings.html&quot;&gt;here&lt;/a&gt; for more information&lt;br&gt;&lt;li&gt;Read and extract &lt;a href=&quot;http://xlsgen.arstdesign.com/core/macros.html&quot;&gt;VBA macros&lt;/a&gt; (i.e. plain text)&lt;br&gt;&lt;li&gt;&lt;a href=&quot;http://xlsgen.arstdesign.com/core/histogram.html&quot;&gt;Histograms&lt;/a&gt;&lt;br&gt;&lt;li&gt;File &lt;a href=&quot;http://xlsgen.arstdesign.com/core/encryption.html&quot;&gt;encryption&lt;/a&gt;&lt;br&gt;&lt;li&gt;Support for 21 new formulas in the calculation engine  : ABS, ACOS, ADDRESS, AND, ASIN, ATAN, AVEDEV, AVERAGE, AVERAGEA, AVERAGEIF, AVERAGEIFS, CEILING, &lt;B&gt;CLEAN&lt;/B&gt;, CHAR, CHOOSE, CODE, COLUMN, &lt;B&gt;COLUMNS&lt;/B&gt;, CONCATENATE, CORREL, COS, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS, DATE, DATEVALUE, DAY, DAYS360, DEGREES, &lt;B&gt;DELTA&lt;/B&gt;, &lt;B&gt;DEVSQ&lt;/B&gt;, &lt;B&gt;ERROR.TYPE&lt;/B&gt;, &lt;B&gt;EVEN&lt;/B&gt;, &lt;B&gt;EXACT&lt;/B&gt;, EXP, EXPONDIST, FACT, &lt;B&gt;FACTDOUBLE&lt;/B&gt;, FALSE, FIND, FIXED, FLOOR, FREQUENCY, &lt;B&gt;GCD&lt;/B&gt;, GEOMEAN, HLOOKUP, HOUR, IF, &lt;B&gt;IFERROR&lt;/B&gt;, INDEX, INDIRECT, INT, INTERCEPT, INTERSECT, ISBLANK, ISERR, ISERROR, &lt;B&gt;ISEVEN&lt;/B&gt;, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, &lt;B&gt;ISODD&lt;/B&gt;, ISREF, ISTEXT, KURT, LARGE, &lt;B&gt;LCM&lt;/B&gt;, LEFT, LEN, &lt;B&gt;LINEST&lt;/B&gt;, LN, LOG, LOG10, LOGEST, LOGNORMDIST, LOOKUP, LOWER, MATCH, MAX, MAXA, MEDIAN, MID, MIN, MINA, MINUTE, MOD, &lt;B&gt;MODE&lt;/B&gt;, MONTH, &lt;B&gt;MROUND&lt;/B&gt;, N, NA, NORMDIST, NORMSDIST, NOT, NOW, &lt;B&gt;ODD&lt;/B&gt;, OFFSET, OR, PEARSON, PERCENTILE, POWER, &lt;B&gt;PRODUCT&lt;/B&gt;, &lt;B&gt;QUOTIENT&lt;/B&gt;, RADIANS, RAND, RANK, REPLACE, REPT, RIGHT, ROUND, ROUNDDOWN, ROUNDUP, ROW, &lt;B&gt;ROWS&lt;/B&gt;, SEARCH, SECOND, SIGN, SIN, SLOPE, SMALL, SQRT, STDEV, STDEVA, STDEVP, STDEVPA, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, &lt;B&gt;SUMPRODUCT&lt;/B&gt;, T, TAN, TEXT, TIME, TIMEVALUE, TODAY, TRIM, TRIMMEAN, TRUE, TYPE, UNION, UPPER, VALUE, VAR, VARA, VARP, VARPA, VLOOKUP, WEEKDAY, YEAR&lt;br&gt;&lt;li&gt;&lt;a href=&quot;http://xlsgen.arstdesign.com/core/googlecharts.html&quot;&gt;Google charts&lt;/a&gt;&lt;br&gt;&lt;li&gt;Export as &lt;a href=&quot;http://xlsgen.arstdesign.com/core/importexport.html#XPS&quot;&gt;XPS&lt;/a&gt;&lt;br&gt;&lt;li&gt;&lt;a href=&quot;http://xlsgen.arstdesign.com/core/customlists.html&quot;&gt;Custom lists&lt;/a&gt;&lt;br&gt;&lt;li&gt;Range helper : &lt;a href=&quot;http://xlsgen.arstdesign.com/core/searchreplace.html&quot;&gt;search and replace&lt;/a&gt;&lt;br&gt;&lt;li&gt;A few new code samples (visual_component, vector_shapes, databar, histogram, read_VBA_macros, querySQLite_datasource, custom_lists)&lt;br&gt;&lt;/ul&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 feature #9 : Custom lists</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Wed, 7 Sep 2011 12:27:53 GMT</pubDate><description>&lt;br&gt;&lt;br&gt;With custom lists, xlsgen 3.0 offers a versatile mechanism for processing data in an order that is not predetermined. The first and most explicit example for custom lists is sorting dates, particularly months : january, february, ...If months are to be sorted alphabetically, january will not come first, so the sorting will be seen as flawed. In fact it takes a custom list to define the expected order.&lt;br&gt;&lt;br&gt;While sorting dates is trivial, sorting other objects is as easy to implement. And there is no reason to limit this to sorting either. For instance, one could use it in the Remove duplicates feature that we've been exposing for some time in order to define a particular relational order between objects. And to help matters, the list has a few important features :&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;it can have a name&lt;br&gt;&lt;li&gt;it can have an arbitrary number of entries (for instance, january, february, ...)&lt;br&gt;&lt;li&gt;each entry can have any number of alternate names (for instance jan, Jan, ...)&lt;br&gt;&lt;li&gt;each entry is selectable, and the selection is passed around&lt;br&gt;&lt;/ul&gt;&lt;br&gt;&lt;br&gt;While two uses of custom lists have already been mentioned, Sorting and Remove duplicates, we'll mention a third use, which is Prompting. Prompting comes when the user has to pick one or more choice in a list. The custom list perfectly fits that model. But it can go well beyond with nested prompting which means entries a list have references to other lists, for instance a country has a number of regions and each region has a number of cities. The corresponding custom lists let define and implement applications where the user will be able to zoom in or out the desired level of detail. That is exactly what is available in the business intelligence prompting features.&lt;br&gt;&lt;br&gt;A code sample using custom lists in different ways is available in the &lt;code&gt;/samples&lt;/code&gt; folder, &lt;code&gt;custom_lists&lt;/code&gt;.&lt;br&gt;&lt;br&gt;&lt;H3&gt;Creating custom lists&lt;/H3&gt;&lt;br&gt;&lt;table&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;language&quot;&gt;C# code&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;br&gt;&lt;font color=green&gt;// build a calendar list meant to allow proper date sorting&lt;/font&gt;&lt;br&gt;IXlsList list = worksheet.NewList();&lt;br&gt;list.Add(&quot;january 2011&quot;);&lt;br&gt;  list.AddAlternate(&quot;january&quot;);&lt;br&gt;list.Add(&quot;feb 2011&quot;);&lt;br&gt;  list.AddAlternate(&quot;february 2011&quot;);&lt;br&gt;  list.AddAlternate(&quot;february&quot;);&lt;br&gt;list.Add(&quot;march 2011&quot;);&lt;br&gt;list.AddAlternate(&quot;march&quot;);&lt;br&gt;...&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;H3&gt;Using custom lists&lt;/H3&gt;&lt;br&gt;&lt;H4&gt;Using custom lists for sorting (1)&lt;/H4&gt;&lt;br&gt;&lt;br&gt;With the regular sort API, it goes like this :&lt;br&gt;&lt;table&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;language&quot;&gt;C# code&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;br&gt;&lt;font color=green&gt;// sort (ascending)&lt;/font&gt;&lt;br&gt;IXlsSort sort = worksheet.NewRange(&quot;C5:E8&quot;).NewSort();&lt;br&gt;sort.PrimaryCustomKey(0, list, 1);&lt;br&gt;sort.Apply();&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;H4&gt;Using custom lists for sorting (2)&lt;/H4&gt;&lt;br&gt;&lt;br&gt;With the business intelligence API, it goes like this :&lt;br&gt;&lt;table&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;language&quot;&gt;C# code&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;br&gt;&lt;font color=green&gt;// same sort (except descending versus ascending) using business intelligence APIs&lt;/font&gt;&lt;br&gt;worksheet.Tables.InferFromWorksheet();&lt;br&gt;IXlsTableSort s1 = worksheet.Tables.get_Item(1).DataResults.Columns.get_ItemByName(&quot;Date&quot;).Sorting;&lt;br&gt;s1.Order = 0;&lt;br&gt;s1.CustomList = list;&lt;br&gt;s1.Apply();&lt;br&gt;worksheet.InsertTableAt(worksheet.Tables.get_Item(1), 4, 7);&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;H4&gt;Using custom lists for removing duplicates&lt;/H4&gt;&lt;br&gt;&lt;table&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;language&quot;&gt;C# code&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;br&gt;IXlsList listIndicators = worksheet.NewList();&lt;br&gt;listIndicators.Add(&quot;L1&quot;);&lt;br&gt;  listIndicators.AddAlternate(&quot;L2&quot;); &lt;font color=green&gt;// that is to say : L2 should be seen as equal to L1&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color=green&gt;// remove duplicates (custom list)&lt;/font&gt;&lt;br&gt;worksheet.NewRange(&quot;R11C3:R15C5&quot;).RemoveDuplicatesUsingList(listIndicators);&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item><item><title>xlsgen 3.0 feature #8 : 21 additional calc functions, Search/Replace</title><link>http://xlsgen.arstdesign.com/Marketing/BugFixes.php</link><pubDate>Tue, 6 Sep 2011 13:43:57 GMT</pubDate><description>&lt;br&gt;xlsgen 3.0 adds 21 functions to the calculation engine (in bold below) :&lt;br&gt;&lt;br&gt;ABS, ACOS, ADDRESS, AND, ASIN, ATAN, AVEDEV, AVERAGE, AVERAGEA, AVERAGEIF, AVERAGEIFS, CEILING, &lt;B&gt;CLEAN&lt;/B&gt;, CHAR, CHOOSE, CODE, COLUMN, &lt;B&gt;COLUMNS&lt;/B&gt;, CONCATENATE, CORREL, COS, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS, DATE, DATEVALUE, DAY, DAYS360, DEGREES, &lt;B&gt;DELTA&lt;/B&gt;, &lt;B&gt;DEVSQ&lt;/B&gt;, &lt;B&gt;ERROR.TYPE&lt;/B&gt;, &lt;B&gt;EVEN&lt;/B&gt;, &lt;B&gt;EXACT&lt;/B&gt;, EXP, EXPONDIST, FACT, &lt;B&gt;FACTDOUBLE&lt;/B&gt;, FALSE, FIND, FIXED, FLOOR, FREQUENCY, &lt;B&gt;GCD&lt;/B&gt;, GEOMEAN, HLOOKUP, HOUR, IF, &lt;B&gt;IFERROR&lt;/B&gt;, INDEX, INDIRECT, INT, INTERCEPT, INTERSECT, ISBLANK, ISERR, ISERROR, &lt;B&gt;ISEVEN&lt;/B&gt;, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, &lt;B&gt;ISODD&lt;/B&gt;, ISREF, ISTEXT, KURT, LARGE, &lt;B&gt;LCM&lt;/B&gt;, LEFT, LEN, &lt;B&gt;LINEST&lt;/B&gt;, LN, LOG, LOG10, LOGEST, LOGNORMDIST, LOOKUP, LOWER, MATCH, MAX, MAXA, MEDIAN, MID, MIN, MINA, MINUTE, MOD, &lt;B&gt;MODE&lt;/B&gt;, MONTH, &lt;B&gt;MROUND&lt;/B&gt;, N, NA, NORMDIST, NORMSDIST, NOT, NOW, &lt;B&gt;ODD&lt;/B&gt;, OFFSET, OR, PEARSON, PERCENTILE, POWER, &lt;B&gt;PRODUCT&lt;/B&gt;, &lt;B&gt;QUOTIENT&lt;/B&gt;, RADIANS, RAND, RANK, REPLACE, REPT, RIGHT, ROUND, ROUNDDOWN, ROUNDUP, ROW, &lt;B&gt;ROWS&lt;/B&gt;, SEARCH, SECOND, SIGN, SIN, SLOPE, SMALL, SQRT, STDEV, STDEVA, STDEVP, STDEVPA, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, &lt;B&gt;SUMPRODUCT&lt;/B&gt;, T, TAN, TEXT, TIME, TIMEVALUE, TODAY, TRIM, TRIMMEAN, TRUE, TYPE, UNION, UPPER, VALUE, VAR, VARA, VARP, VARPA, VLOOKUP, WEEKDAY, YEAR&lt;br&gt;&lt;br&gt;&lt;br&gt;xlsgen 3.0 also adds search/replace capabilities :&lt;br&gt;&lt;br&gt;&lt;img src=&quot;http://xlsgen.arstdesign.com/core/searchreplace1.jpg&quot; border=1&gt;&lt;br&gt;&lt;br&gt;Trivial to use : worksheet.NewRange(&quot;C3:I9&quot;).SearchAndReplace(&quot;word&quot;, &quot;ppt&quot;);&lt;br&gt;&lt;br&gt;The method call actually also returns how many replacements have occured making it easy to track the evolution of the contents of the worksheet.&lt;br&gt;&lt;br&gt;</description><category>xlsgen, Excel generator</category><dc:creator>ARsT design</dc:creator><slash:comments>0</slash:comments></item></channel></rss>

