<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=SCI.XLSX.RECALL</id>
	<title>SCI.XLSX.RECALL - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=SCI.XLSX.RECALL"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=SCI.XLSX.RECALL&amp;action=history"/>
	<updated>2026-04-28T23:18:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=SCI.XLSX.RECALL&amp;diff=2598&amp;oldid=prev</id>
		<title>IanMcGowan: Example of creating a &quot;true&quot; XLSX file that can be opened natively by Excel</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=SCI.XLSX.RECALL&amp;diff=2598&amp;oldid=prev"/>
		<updated>2017-03-03T06:29:49Z</updated>

		<summary type="html">&lt;p&gt;Example of creating a &amp;quot;true&amp;quot; XLSX file that can be opened natively by Excel&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Since Office 2010, the internal format used for Office documents has switched to a zipped collection of XML files.  Since these are &amp;quot;just&amp;quot; text files, it&amp;#039;s reasonable to attempt to produce them directly from a PICK Basic program, and this is certainly feasible.  Trying to reverse-engineer the xlsx XML schema can be challenging - Excel throws everything and the kitchen sink into the zip file, and small errors lead to Excel rejecting the entire file.  [http://polymathprogrammer.com/tag/openxml/ Polymath Programmer] has some excellent resources to explain what&amp;#039;s going on at just the right level of detail.  Well worth buying the [http://polymathprogrammer.com/about/ book], and the free [http://spreadsheetlight.com/ code] if you&amp;#039;re using DotNet.&lt;br /&gt;
&lt;br /&gt;
The code below is an example of creating the XML files and zipping them to produce a file that can be opened natively in Excel.  If the wiki formatting causes any problems, the latest version can be retrieved from: https://github.com/ianmcgowan/SCI.BP/blob/master/SCI.XLSX.RECALL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* Program: SCI.XLS.RECALL&lt;br /&gt;
* Author : MCGOWJ01&lt;br /&gt;
* Date   : 2017-02-10&lt;br /&gt;
* Edited : &lt;br /&gt;
* Comment: Convert a recall into an excel sheet&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* LOG DATE   BY           CHANGE&lt;br /&gt;
* ---------- ------------ -------------------------------------------------&lt;br /&gt;
* SEE: https://blogs.msdn.microsoft.com/brian_jones/2006/11/02/simple-spreadsheetml-file-part-1-of-3/&lt;br /&gt;
*      http://polymathprogrammer.com/2010/01/11/custom-column-widths-in-excel-open-xml/&lt;br /&gt;
*      &lt;br /&gt;
DEBUG=0&lt;br /&gt;
S=@SENTENCE&lt;br /&gt;
FILE.NAME=FIELD(S,&amp;#039; &amp;#039;,2)&lt;br /&gt;
IF INDEX(FILE.NAME,&amp;#039;/&amp;#039;,1) = 0 THEN STOP FILE.NAME:&amp;#039; is not a directory&amp;#039;&lt;br /&gt;
OPENSEQ FILE.NAME TO INPUT.F ELSE STOP 201,FILE.NAME&lt;br /&gt;
OUTPUT.DIR=FILE.NAME:&amp;#039;.TMP&amp;#039;&lt;br /&gt;
EXECUTE &amp;#039;!rm -rf &amp;#039;:OUTPUT.DIR  ;* Maybe check the filename isn&amp;#039;t ./.. before this?&lt;br /&gt;
EXECUTE &amp;#039;!mkdir &amp;#039;:OUTPUT.DIR&lt;br /&gt;
EXECUTE &amp;#039;!mkdir &amp;#039;:OUTPUT.DIR:&amp;#039;/_rels&amp;#039;&lt;br /&gt;
EXECUTE &amp;#039;!mkdir &amp;#039;:OUTPUT.DIR:&amp;#039;/xl&amp;#039;&lt;br /&gt;
EXECUTE &amp;#039;!mkdir &amp;#039;:OUTPUT.DIR:&amp;#039;/xl/_rels&amp;#039;&lt;br /&gt;
EXECUTE &amp;#039;!mkdir &amp;#039;:OUTPUT.DIR:&amp;#039;/xl/worksheets&amp;#039;&lt;br /&gt;
* This next command unzips an empty excel sheet for us to work with&lt;br /&gt;
*EXECUTE &amp;#039;!cd &amp;#039;:OUTPUT.DIR:&amp;#039; ; unzip /info/local/bin/template.xlsx&amp;#039; CAPTURING DUMMY&lt;br /&gt;
OPEN &amp;#039;RECALLS&amp;#039; TO RECALLS ELSE STOP 201,&amp;#039;RECALLS&amp;#039;&lt;br /&gt;
GOSUB GET.FIELD.NAMES&lt;br /&gt;
IF DEBUG THEN&lt;br /&gt;
  PRINT &amp;#039;FIELD.MAP&amp;#039;&lt;br /&gt;
  FOR F=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    PRINT F&amp;#039;R#2&amp;#039;:&amp;#039; &amp;#039;:FIELD.MAP&amp;lt;6,F&amp;gt;&amp;#039;L#20&amp;#039;:&amp;#039; &amp;#039;:FIELD.MAP&amp;lt;2,F&amp;gt;&amp;#039;L#35&amp;#039;:&amp;#039; &amp;#039;:FIELD.MAP&amp;lt;3,F&amp;gt;&lt;br /&gt;
  NEXT F&lt;br /&gt;
END&lt;br /&gt;
CONTROL.CHARS=&amp;#039;&amp;#039;&lt;br /&gt;
FOR CHARACTER = 127 TO 249 &lt;br /&gt;
  CONTROL.CHARS:=CHAR(CHARACTER) &lt;br /&gt;
NEXT CHARACTER &lt;br /&gt;
*&lt;br /&gt;
GOSUB XLS.HEADER&lt;br /&gt;
ROW.COUNT=0&lt;br /&gt;
LOOP&lt;br /&gt;
  READSEQ ROW FROM INPUT.F ELSE EXIT&lt;br /&gt;
  ROW.COUNT+=1&lt;br /&gt;
  GOSUB XLS.BODY&lt;br /&gt;
REPEAT&lt;br /&gt;
*GOSUB XLS.TOTALS&lt;br /&gt;
GOSUB XLS.FOOTER&lt;br /&gt;
CLOSE OUTPUT.F&lt;br /&gt;
*&lt;br /&gt;
EXCEL.NAME=FIELD(FILE.NAME,&amp;#039;/&amp;#039;,DCOUNT(FILE.NAME,&amp;#039;/&amp;#039;)):&amp;#039;.xlsx&amp;#039;&lt;br /&gt;
EXECUTE &amp;#039;!cd &amp;#039;:OUTPUT.DIR:&amp;#039; ; zip -r &amp;#039;:EXCEL.NAME:&amp;#039; *&amp;#039; CAPTURING DUMMY&lt;br /&gt;
RECIP=&amp;#039;&amp;#039; ; FROM.USER=&amp;#039;&amp;#039; ; CC.USER=&amp;#039;&amp;#039; ;* Let the SUBR figure it out&lt;br /&gt;
MSG=&amp;#039;Please find your report attached&amp;#039;&lt;br /&gt;
SUBJECT=&amp;#039;REPORT:&amp;#039;:EXCEL.NAME&lt;br /&gt;
ATTACH=OUTPUT.DIR:&amp;#039;/&amp;#039;:EXCEL.NAME&lt;br /&gt;
OPTIONS=&amp;#039;&amp;#039;&lt;br /&gt;
CALL SCI.MAIL.SUB(RECIP, FROM.USER, CC.USER, MSG, ATTACH, SUBJECT, OPTIONS)&lt;br /&gt;
STOP&lt;br /&gt;
*&lt;br /&gt;
XLS.BODY:&lt;br /&gt;
  L=&amp;#039;&amp;lt;x:row&amp;gt;&amp;#039; ; GOSUB WRITE.LINE&lt;br /&gt;
  CONVERT &amp;#039;^&amp;#039; TO @VM IN ROW&lt;br /&gt;
  FOR C=1 TO DCOUNT(ROW&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    CELL=ROW&amp;lt;1,C&amp;gt;&lt;br /&gt;
    GOSUB URL.ENCODE.CELL&lt;br /&gt;
    FORMAT=FIELD.MAP&amp;lt;3,C&amp;gt;&lt;br /&gt;
    CELL.NUM=CELL ; CONVERT &amp;#039;,&amp;#039; TO &amp;#039;&amp;#039; IN CELL.NUM&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE FORMAT[1,1]=&amp;#039;D&amp;#039; AND ICONV(CELL,&amp;#039;D&amp;#039;) # &amp;#039;&amp;#039; ;* Date&lt;br /&gt;
        CELL=ICONV(CELL,&amp;#039;D&amp;#039;)+24837 ;* 12/31/1967-12/31/1899=24837&lt;br /&gt;
        L=&amp;#039;&amp;lt;x:c s=&amp;quot;1&amp;quot; t=&amp;quot;Date&amp;quot;&amp;gt;&amp;lt;x:v&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/x:v&amp;gt;&amp;lt;/x:c&amp;gt;&amp;#039;&lt;br /&gt;
      CASE FORMAT[1,2]=&amp;#039;MD&amp;#039; OR FORMAT[1,2]=&amp;#039;MR&amp;#039;     ;* Number&lt;br /&gt;
        CONVERT &amp;#039;,&amp;#039; TO &amp;#039;&amp;#039; IN CELL&lt;br /&gt;
        IF NUM(CELL) THEN&lt;br /&gt;
          L=&amp;#039;&amp;lt;x:c s=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;x:v&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/x:v&amp;gt;&amp;lt;/x:c&amp;gt;&amp;#039;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          L=&amp;#039;&amp;lt;x:c t=&amp;quot;str&amp;quot;&amp;gt;&amp;lt;x:v&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/x:v&amp;gt;&amp;lt;/x:c&amp;gt;&amp;#039;&lt;br /&gt;
        END&lt;br /&gt;
      CASE 1 ;* String is default type&lt;br /&gt;
        IF NUM(CELL.NUM) AND CELL.NUM#&amp;#039;&amp;#039; THEN&lt;br /&gt;
          * It&amp;#039;s a number, but leave is unstyled so zip 90210 doesn&amp;#039;t become 90210.00&lt;br /&gt;
          L=&amp;#039;&amp;lt;x:c&amp;gt;&amp;lt;x:v&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/x:v&amp;gt;&amp;lt;/x:c&amp;gt;&amp;#039;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          L=&amp;#039;&amp;lt;x:c t=&amp;quot;str&amp;quot;&amp;gt;&amp;lt;x:v&amp;gt;&amp;#039;:CELL:&amp;#039;&amp;lt;/x:v&amp;gt;&amp;lt;/x:c&amp;gt;&amp;#039;&lt;br /&gt;
        END&lt;br /&gt;
    END CASE&lt;br /&gt;
    GOSUB WRITE.LINE&lt;br /&gt;
  NEXT C&lt;br /&gt;
  L=&amp;#039;&amp;lt;/x:row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
XLS.TOTALS:&lt;br /&gt;
  L=&amp;#039;&amp;lt;Row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  FOR C=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    FORMAT=FIELD.MAP&amp;lt;3,C&amp;gt;&lt;br /&gt;
    IF FORMAT[1,2]=&amp;#039;MD&amp;#039; OR FORMAT[1,2]=&amp;#039;MR&amp;#039; THEN&lt;br /&gt;
      * Number col, add total to bottom row&lt;br /&gt;
      L=&amp;#039;  &amp;lt;Cell ss:Index=&amp;quot;&amp;#039;:C:&amp;#039;&amp;quot; ss:Formula=&amp;quot;=SUM(R[-&amp;#039;:ROW.COUNT:&amp;#039;]C:R[-1]C)&amp;quot;&amp;gt;&amp;lt;Data ss:Type=&amp;quot;Number&amp;quot;&amp;gt;0&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;#039;&lt;br /&gt;
      GOSUB WRITE.LINE&lt;br /&gt;
    END&lt;br /&gt;
  NEXT C&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
URL.ENCODE.CELL:&lt;br /&gt;
  * Certain characters not allowed in XML - escape them&lt;br /&gt;
  CONVERT CONTROL.CHARS TO &amp;#039;&amp;#039; IN CELL ;* Zap unicode/other code pages&lt;br /&gt;
  SWAP &amp;#039;&amp;amp;&amp;#039; WITH &amp;#039;&amp;amp;amp;&amp;#039; IN CELL&lt;br /&gt;
  SWAP &amp;#039;&amp;lt;&amp;#039; WITH &amp;#039;&amp;amp;lt;&amp;#039;  IN CELL&lt;br /&gt;
  SWAP &amp;#039;&amp;gt;&amp;#039; WITH &amp;#039;&amp;amp;gt;&amp;#039;  IN CELL&lt;br /&gt;
  CELL=TRIM(CELL);* No benefit to leading or trailing spaces&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
XLS.HEADER:&lt;br /&gt;
  * A minimal XLSX sheet consists of 6 files&lt;br /&gt;
  * [Content_Types].xml&lt;br /&gt;
  * _rels/.rels&lt;br /&gt;
  * xl/_rels/workbook.xml.rels&lt;br /&gt;
  * xl/styles.xml&lt;br /&gt;
  * xl/workbook.xml&lt;br /&gt;
  * xl/worksheets/sheet.xml&lt;br /&gt;
  *&lt;br /&gt;
  OUTPUT.FILE.NAME=OUTPUT.DIR:&amp;#039;/[Content_Types].xml&amp;#039;&lt;br /&gt;
  GOSUB OPEN.FILE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;Types xmlns=&amp;quot;http://schemas.openxmlformats.org/package/2006/content-types&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;Default ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml&amp;quot; Extension=&amp;quot;xml&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;Default ContentType=&amp;quot;application/vnd.openxmlformats-package.relationships+xml&amp;quot; Extension=&amp;quot;rels&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;Override ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml&amp;quot; PartName=&amp;quot;/xl/worksheets/sheet.xml&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;Override ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml&amp;quot; PartName=&amp;quot;/xl/styles.xml&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Types&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  *&lt;br /&gt;
  OUTPUT.FILE.NAME=OUTPUT.DIR:&amp;#039;/_rels/.rels&amp;#039;&lt;br /&gt;
  GOSUB OPEN.FILE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;Relationships xmlns=&amp;quot;http://schemas.openxmlformats.org/package/2006/relationships&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Relationship Id=&amp;quot;Rb5834f0a9fe74ac0&amp;quot; Target=&amp;quot;/xl/workbook.xml&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Relationships&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  *&lt;br /&gt;
  OUTPUT.FILE.NAME=OUTPUT.DIR:&amp;#039;/xl/_rels/workbook.xml.rels&amp;#039;&lt;br /&gt;
  GOSUB OPEN.FILE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;Relationships xmlns=&amp;quot;http://schemas.openxmlformats.org/package/2006/relationships&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Relationship Id=&amp;quot;R203d98ce4bbc4619&amp;quot; Target=&amp;quot;/xl/worksheets/sheet.xml&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;Relationship Id=&amp;quot;R8dd86d2508e64fce&amp;quot; Target=&amp;quot;/xl/styles.xml&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/Relationships&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  *&lt;br /&gt;
  * This one controls styles and formats.  It&amp;#039;s, complicated.&lt;br /&gt;
  OUTPUT.FILE.NAME=OUTPUT.DIR:&amp;#039;/xl/styles.xml&amp;#039;&lt;br /&gt;
  GOSUB OPEN.FILE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;x:styleSheet xmlns:x=&amp;quot;http://schemas.openxmlformats.org/spreadsheetml/2006/main&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  * This section controls number and date formats, and is refered below by the styles. 164=0, 165=1, etc&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:numFmts count=&amp;quot;5&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:numFmt formatCode=&amp;quot;dd/mm/yyyy&amp;quot; numFmtId=&amp;quot;164&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:numFmt formatCode=&amp;quot;#,##0.0000&amp;quot; numFmtId=&amp;quot;165&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:numFmt formatCode=&amp;quot;#,##0.00&amp;quot; numFmtId=&amp;quot;166&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:numFmt formatCode=&amp;quot;@&amp;quot; numFmtId=&amp;quot;167&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:numFmt formatCode=&amp;quot;mm/dd/yyyy&amp;quot; numFmtId=&amp;quot;168&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:numFmts&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:fonts count=&amp;quot;2&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:font&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:sz val=&amp;quot;11&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:name val=&amp;quot;Calibri&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;/x:font&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:font&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:sz val=&amp;quot;11&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:color tint=&amp;quot;-0.499984740745262&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:name val=&amp;quot;Calibri&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;/x:font&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:fonts&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:fills count=&amp;quot;2&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:fill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:patternFill patternType=&amp;quot;none&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;/x:fill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:fill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:patternFill patternType=&amp;quot;gray125&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;/x:fill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:fill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:patternFill patternType=&amp;quot;solid&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;                &amp;lt;x:fgColor tint=&amp;quot;0.79998168889431442&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;                &amp;lt;x:bgColor indexed=&amp;quot;64&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;/x:patternFill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;/x:fill&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:fills&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:borders count=&amp;quot;1&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:border&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:left/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:right/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:top/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:bottom/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;            &amp;lt;x:diagonal/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;/x:border&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:borders&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:cellStyleXfs count=&amp;quot;1&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:cellStyleXfs&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:cellXfs count=&amp;quot;5&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  * These styles are indexed by number from the cell references with &amp;lt;c s=&amp;quot;1&amp;quot;&amp;gt; picking numFmtId=&amp;quot;165&amp;quot;&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;0&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf applyNumberFormat=&amp;quot;1&amp;quot; borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;14&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf applyNumberFormat=&amp;quot;1&amp;quot; borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;165&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf applyNumberFormat=&amp;quot;1&amp;quot; borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;166&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf applyNumberFormat=&amp;quot;1&amp;quot; borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;167&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf applyNumberFormat=&amp;quot;1&amp;quot; borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;0&amp;quot; fontId=&amp;quot;0&amp;quot; numFmtId=&amp;quot;168&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:xf applyNumberFormat=&amp;quot;0&amp;quot; borderId=&amp;quot;0&amp;quot; fillId=&amp;quot;2&amp;quot; fontId=&amp;quot;1&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:cellXfs&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:cellStyles count=&amp;quot;1&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:cellStyle builtinId=&amp;quot;0&amp;quot; name=&amp;quot;Normal&amp;quot; xfId=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:cellStyles&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:dxfs count=&amp;quot;0&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:tableStyles count=&amp;quot;0&amp;quot; defaultPivotStyle=&amp;quot;PivotStyleLight16&amp;quot; defaultTableStyle=&amp;quot;TableStyleMedium9&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/x:styleSheet&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  *&lt;br /&gt;
  OUTPUT.FILE.NAME=OUTPUT.DIR:&amp;#039;/xl/workbook.xml&amp;#039;&lt;br /&gt;
  GOSUB OPEN.FILE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;x:workbook xmlns:r=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships&amp;quot; xmlns:x=&amp;quot;http://schemas.openxmlformats.org/spreadsheetml/2006/main&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:fileVersion appName=&amp;quot;Microsoft Office Excel&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;x:sheets&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;        &amp;lt;x:sheet name=&amp;quot;Sheet1&amp;quot; r:id=&amp;quot;R203d98ce4bbc4619&amp;quot; sheetId=&amp;quot;1&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;    &amp;lt;/x:sheets&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/x:workbook&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  *&lt;br /&gt;
  OUTPUT.FILE.NAME=OUTPUT.DIR:&amp;#039;/xl/worksheets/sheet.xml&amp;#039;&lt;br /&gt;
  GOSUB OPEN.FILE&lt;br /&gt;
  L=&amp;#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;x:worksheet xmlns:x=&amp;quot;http://schemas.openxmlformats.org/spreadsheetml/2006/main&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;  &amp;lt;x:sheetData&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  * &lt;br /&gt;
  * Now heading values in row 1&lt;br /&gt;
  *&lt;br /&gt;
  * Column definitions&lt;br /&gt;
  FOR C=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    FORMAT=FIELD.MAP&amp;lt;3,C&amp;gt;&lt;br /&gt;
    MASK=FIELD.MAP&amp;lt;5,C&amp;gt;&lt;br /&gt;
    MASK=MASK[1,LEN(MASK)-1]&lt;br /&gt;
    IF NOT(NUM(MASK)) THEN MASK=10&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE FORMAT[1,1]=&amp;#039;D&amp;#039;  ;* Date&lt;br /&gt;
        STYLE=&amp;#039;s102&amp;#039;&lt;br /&gt;
      CASE FORMAT[1,2]=&amp;#039;MD&amp;#039; OR FORMAT[1,2]=&amp;#039;MR&amp;#039; ;* Number&lt;br /&gt;
        IF FORMAT[3,1]=&amp;#039;0&amp;#039; THEN&lt;br /&gt;
          STYLE=&amp;#039;s103&amp;#039;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          STYLE=&amp;#039;s101&amp;#039;&lt;br /&gt;
        END&lt;br /&gt;
      CASE 1 ;* String is default type&lt;br /&gt;
        STYLE=&amp;#039;Default&amp;#039;&lt;br /&gt;
    END CASE&lt;br /&gt;
    L=&amp;#039;      &amp;lt;Column ss:Index=&amp;quot;&amp;#039;:C:&amp;#039;&amp;quot; ss:StyleID=&amp;quot;&amp;#039;:STYLE:&amp;#039;&amp;quot; ss:Width=&amp;quot;&amp;#039;:MASK*10:&amp;#039;&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
    *GOSUB WRITE.LINE&lt;br /&gt;
  NEXT C&lt;br /&gt;
  *&lt;br /&gt;
  * Now write a header row&lt;br /&gt;
  *&lt;br /&gt;
  L=&amp;#039;&amp;lt;x:row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  FOR C=1 TO DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    L=&amp;#039;  &amp;lt;x:c s=&amp;quot;6&amp;quot; t=&amp;quot;str&amp;quot;&amp;gt;&amp;lt;x:v&amp;gt;&amp;#039;&lt;br /&gt;
    *CELL=TRIM(FIELD.MAP&amp;lt;4,C&amp;gt;)&lt;br /&gt;
    *IF CELL=&amp;#039;&amp;#039; THEN CELL=FIELD.MAP&amp;lt;6,C&amp;gt;&lt;br /&gt;
    CELL=FIELD.MAP&amp;lt;6,C&amp;gt;&lt;br /&gt;
    GOSUB URL.ENCODE.CELL&lt;br /&gt;
    L:=CELL&lt;br /&gt;
    L:=&amp;#039;&amp;lt;/x:v&amp;gt;&amp;lt;/x:c&amp;gt;&amp;#039;&lt;br /&gt;
    GOSUB WRITE.LINE&lt;br /&gt;
  NEXT C&lt;br /&gt;
  L=&amp;#039;&amp;lt;/x:row&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
XLS.FOOTER:&lt;br /&gt;
  L=&amp;#039;  &amp;lt;/x:sheetData&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
  L=&amp;#039;&amp;lt;/x:worksheet&amp;gt;&amp;#039;&lt;br /&gt;
  GOSUB WRITE.LINE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
OPEN.FILE:&lt;br /&gt;
  EXECUTE &amp;#039;!rm -f &amp;#039;:OUTPUT.FILE.NAME&lt;br /&gt;
  EXECUTE &amp;#039;!touch &amp;#039;:OUTPUT.FILE.NAME&lt;br /&gt;
  OPENSEQ OUTPUT.FILE.NAME TO OUTPUT.F ELSE STOP &amp;#039;CANNOT OPEN &amp;#039;:OUTPUT.FILE.NAME&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
WRITE.LINE:&lt;br /&gt;
  *IF DEBUG THEN PRINT L&lt;br /&gt;
  WRITESEQ L:CHAR(13) APPEND ON OUTPUT.F ELSE STOP &amp;#039;ERROR WRITING &amp;#039;:FILE.NAME&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GET.FIELD.NAMES:&lt;br /&gt;
  FIELD.MAP=&amp;#039;&amp;#039;&lt;br /&gt;
  RECALL.NAME=FIELD(FILE.NAME,&amp;#039;/&amp;#039;,DCOUNT(FILE.NAME,&amp;#039;/&amp;#039;))&lt;br /&gt;
  READV R FROM RECALLS, RECALL.NAME, 1 ELSE STOP &amp;#039;CANNOT READ RECALLS:&amp;#039;:RECALL.NAME&lt;br /&gt;
  DATA.FILE=&amp;#039;&amp;#039;&lt;br /&gt;
  FOR F=1 TO DCOUNT(R,@VM)&lt;br /&gt;
    L=R&amp;lt;1,F&amp;gt;&lt;br /&gt;
    IF FIELD(L,&amp;#039; &amp;#039;,1) = &amp;#039;list&amp;#039; OR FIELD(L,&amp;#039; &amp;#039;,1) = &amp;#039;sort&amp;#039; THEN&lt;br /&gt;
      IF DATA.FILE # &amp;#039;&amp;#039; THEN STOP &amp;#039;CAN ONLY PROCESS ONE list OR sort PER RECALL&amp;#039;&lt;br /&gt;
      DATA.FILE=FIELD(L,&amp;#039; &amp;#039;,2)&lt;br /&gt;
      OPEN &amp;#039;DICT&amp;#039;,DATA.FILE TO DICT ELSE STOP &amp;#039;CANNOT OPEN DICT &amp;#039;:DATA.FILE&lt;br /&gt;
    END&lt;br /&gt;
    IF DATA.FILE # &amp;#039;&amp;#039; THEN&lt;br /&gt;
      FOR WC=1 TO DCOUNT(L,&amp;#039; &amp;#039;)&lt;br /&gt;
        * list LS.MASTER FIELD1 FIELD2 ETC..  Skip the first two&lt;br /&gt;
        ATB=FIELD(L,&amp;#039; &amp;#039;,WC)&lt;br /&gt;
        IF ATB=&amp;#039;list&amp;#039; OR ATB=&amp;#039;sort&amp;#039; THEN CONTINUE&lt;br /&gt;
        IF ATB=DATA.FILE THEN CONTINUE&lt;br /&gt;
        IF ATB=&amp;#039;TO&amp;#039; THEN&lt;br /&gt;
           * Stop when we get to the TO DELIM etc...&lt;br /&gt;
           RETURN&lt;br /&gt;
        END&lt;br /&gt;
        READ DICT.REC FROM DICT, ATB THEN&lt;br /&gt;
          TYPE=DICT.REC&amp;lt;1&amp;gt;&lt;br /&gt;
          CORR=DICT.REC&amp;lt;2&amp;gt;&lt;br /&gt;
          CONV=DICT.REC&amp;lt;3&amp;gt;&lt;br /&gt;
          HEAD=DICT.REC&amp;lt;4&amp;gt;&lt;br /&gt;
          MASK=DICT.REC&amp;lt;5&amp;gt;&lt;br /&gt;
          N=DCOUNT(FIELD.MAP&amp;lt;1&amp;gt;,@VM)+1 ;* Always nervous of NULL with &amp;lt;1,-1&amp;gt;&lt;br /&gt;
          FIELD.MAP&amp;lt;1,N&amp;gt;=TYPE&lt;br /&gt;
          FIELD.MAP&amp;lt;2,N&amp;gt;=CORR&lt;br /&gt;
          FIELD.MAP&amp;lt;3,N&amp;gt;=CONV&lt;br /&gt;
          FIELD.MAP&amp;lt;4,N&amp;gt;=HEAD&lt;br /&gt;
          FIELD.MAP&amp;lt;5,N&amp;gt;=MASK&lt;br /&gt;
          FIELD.MAP&amp;lt;6,N&amp;gt;=ATB&lt;br /&gt;
        END ELSE&lt;br /&gt;
          IF ATB # &amp;#039;BY&amp;#039; AND ATB # &amp;#039;WITH&amp;#039; THEN&lt;br /&gt;
            PRINT &amp;#039;ATB &amp;#039;:ATB:&amp;#039; NOT FOUND IN DICT &amp;#039;:DATA.FILE&lt;br /&gt;
          END&lt;br /&gt;
        END&lt;br /&gt;
      NEXT WC&lt;br /&gt;
    END&lt;br /&gt;
  NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
</feed>