<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1906568117185574156</id><updated>2012-02-16T05:48:45.894-08:00</updated><category term='C#'/><category term='Open XML SDK'/><category term='Visual Studio'/><category term='Microsoft'/><category term='PDF'/><category term='OpenXML'/><category term='PSC'/><category term='PresentationML'/><category term='SpreadsheetML'/><category term='OOXML'/><category term='Word'/><category term='Powerpoint'/><category term='.NET'/><category term='Excel'/><title type='text'>Andrew Schwantes</title><subtitle type='html'>Delving into the worlds of OpenXML, C#, and SQL Server. And maybe a little sports and leisure mixed in.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kaark</name><uri>http://www.blogger.com/profile/11514698286352909934</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/-NU4JSdLkawM/TchVxBHMxHI/AAAAAAAABHo/nOT5CPyHvz4/s220/drewThumb.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-275574131324118550</id><published>2010-05-04T09:08:00.001-07:00</published><updated>2010-05-04T09:08:17.278-07:00</updated><title type='text'>Creating New Presentations from Slide Masters Using OpenXML (Revisited)</title><content type='html'>Here’s an update to a prior post, &lt;a href="http://codingthedocument.wordpress.com/2010/03/24/creating-new-presentations-using-the-slide-master/"&gt;Creating New Presentations from Slide Masters Using OpenXML&lt;/a&gt;, about creating new presentation slides from the slide master.  A reader commented about an error with layouts that had images in them and it came to my attention that my code completely ignored the images.  Here’s an update:&lt;br /&gt;&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;margin:20px 0 10px;padding:4px;"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0;"&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertSlide(PresentationPart pPart, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; layoutName, UInt32 slideId)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            Slide slide = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Slide(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CommonSlideData(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ShapeTree()));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            SlidePart sPart = pPart.AddNewPart&amp;lt;SlidePart&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            slide.Save(sPart);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            SlideMasterPart smPart = pPart.SlideMasterParts.First();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            SlideLayoutPart slPart = smPart.SlideLayoutParts.Single(kaark =&amp;gt; kaark.SlideLayout.CommonSlideData.Name == layoutName);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            &lt;span style="color:#008000;"&gt;//Add the layout part to the new slide from the slide master&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            sPart.AddPart&amp;lt;SlideLayoutPart&amp;gt;(slPart);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            sPart.Slide.CommonSlideData = (CommonSlideData)smPart.SlideLayoutParts.Single(kaark =&amp;gt; kaark.SlideLayout.CommonSlideData.Name == layoutName).SlideLayout.CommonSlideData.Clone();&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (Stream stream = slPart.GetStream())&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;                sPart.SlideLayoutPart.FeedData(stream);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            &lt;span style="color:#008000;"&gt;//UPDATED: Copy the images from the slide master layout to the new slide&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ImagePart iPart &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; slPart.ImageParts)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;                ImagePart newImagePart = sPart.AddImagePart(iPart.ContentType, slPart.GetIdOfPart(iPart));&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;                newImagePart.FeedData(iPart.GetStream());&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt; &lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            SlideId newSlideId = pPart.Presentation.SlideIdList.AppendChild&amp;lt;SlideId&amp;gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SlideId());&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;            newSlideId.Id = slideId;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"&gt;            newSlideId.RelationshipId = pPart.GetIdOfPart(sPart);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;After feeding the slide layout part data into the new slide’s layout part, the code then adds the new image parts to the slide from the slide master layout.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-275574131324118550?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/275574131324118550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=275574131324118550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/275574131324118550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/275574131324118550'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2010/05/creating-new-presentations-from-slide.html' title='Creating New Presentations from Slide Masters Using OpenXML (Revisited)'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-3424756766793669105</id><published>2010-03-24T08:22:00.001-07:00</published><updated>2010-04-21T12:52:21.657-07:00</updated><title type='text'>Creating New Presentations Using the Slide Master</title><content type='html'>&lt;b&gt;Note:&lt;/b&gt; Cross posted from &lt;a href="http://codingthedocument.wordpress.com/"&gt;Coding The Document&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codingthedocument.wordpress.com/2010/03/24/creating-new-presentations-using-the-slide-master/"&gt;Permalink&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The slide master in Powerpoint provides a powerful way for end-users to easily control the appearance and layouts of a presentation. A slide master contains a set of layouts that are subsequently used by the slides in the presentation.&lt;/p&gt;&lt;p&gt;A common approach to constructing a new presentation is to have a template with slides that are then copied/merged into the new presentation. The approach I will be demonstrating creates slides in the new presentation based off the slide master layouts in the template. This approach still requires a template, but does not require slides to already exist. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Template&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The template I used contained a few layouts in the slide master, each arranged with some placeholder objects. A great benefit of layouts in the slide master is that they can be renamed through the UI. The layout name is what will be used in the code to construct the slide deck in the new presentation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Code&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Now the fun part. The InsertSlide method takes a PresentationPart, layout name from the slide master, and ID for the new slide. It creates the new Slide and adds the associated parts to the PresentationPart, copying all the required layout and common slide data from the slide master layout.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="FONT-SIZE: 10pt" class="c#:nogutter" name="code"&gt;&lt;br /&gt;private static void InsertSlide(PresentationPart pPart, string layoutName, UInt32 slideId)&lt;br /&gt;        {&lt;br /&gt;            Slide slide = new Slide(new CommonSlideData(new ShapeTree()));&lt;br /&gt;            SlidePart sPart = pPart.AddNewPart&lt;slidepart&gt;();&lt;br /&gt;            slide.Save(sPart);&lt;br /&gt;            SlideMasterPart smPart = pPart.SlideMasterParts.First();&lt;br /&gt;            SlideLayoutPart slPart = smPart.SlideLayoutParts.Single(kaark =&gt; kaark.SlideLayout.CommonSlideData.Name == layoutName);&lt;br /&gt;            sPart.AddPart&lt;slidelayoutpart&gt;(slPart);&lt;br /&gt;            sPart.Slide.CommonSlideData = (CommonSlideData)smPart.SlideLayoutParts.Single(kaark =&gt; kaark.SlideLayout.CommonSlideData.Name == layoutName).SlideLayout.CommonSlideData.Clone();&lt;br /&gt;            using (Stream stream = slPart.GetStream())&lt;br /&gt;            {&lt;br /&gt;                sPart.SlideLayoutPart.FeedData(stream);&lt;br /&gt;            }&lt;br /&gt;            SlideId newSlideId = pPart.Presentation.SlideIdList.AppendChild&lt;slideid&gt;(new SlideId());&lt;br /&gt;            newSlideId.Id = slideId;&lt;br /&gt;            newSlideId.RelationshipId = pPart.GetIdOfPart(sPart);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Since the presentation started with only a slide master in the template and no slides, a SlideIdList must be added to the PresentationPart. Then start adding slides, using the layout names from the slide master. Notice that the slide IDs were started at 256, that’s not a typo. Slide IDs must be &amp;gt;= 256.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="FONT-SIZE: 10pt" class="c#:nogutter" name="code"&gt;&lt;br /&gt;using (PresentationDocument pDoc = PresentationDocument.Open(newFileCopiedFromTemplate, true))&lt;br /&gt;{&lt;br /&gt;PresentationPart pPart = pDoc.PresentationPart;&lt;br /&gt;pPart.Presentation.SlideIdList = new SlideIdList();&lt;br /&gt;InsertSlide(pPart, "Layout1", 256);&lt;br /&gt;InsertSlide(pPart, "Layout3", 257);&lt;br /&gt;InsertSlide(pPart, "Layout3", 258);&lt;br /&gt;InsertSlide(pPart, "Layout2", 259);&lt;br /&gt;pPart.Presentation.Save();&lt;br /&gt;pDoc.Close();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-3424756766793669105?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/3424756766793669105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=3424756766793669105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/3424756766793669105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/3424756766793669105'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2010/03/creating-new-presentations-using-slide.html' title='Creating New Presentations Using the Slide Master'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-1361189505043272740</id><published>2009-11-04T07:18:00.000-08:00</published><updated>2009-11-04T07:51:39.586-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Open XML SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='OOXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Word'/><title type='text'>Open XML and Office Services</title><content type='html'>Brian Jones has a new post on his blog, &lt;a href="http://blogs.msdn.com/brian_jones/archive/2009/11/03/open-xml-and-office-services.aspx"&gt;http://blogs.msdn.com/brian_jones/archive/2009/11/03/open-xml-and-office-services.aspx&lt;/a&gt; ,showing a great scenario for using Open XML and the new Office Services.  A big highlight for me with these new tools is the ability to create PDFs at the end of the document generation process without including the Word client and performing Office automation.  The scenario highlighted is just the tip of the iceberg of the power being brought to the enterprise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-1361189505043272740?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/1361189505043272740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=1361189505043272740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/1361189505043272740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/1361189505043272740'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2009/11/open-xml-and-office-services.html' title='Open XML and Office Services'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-7188551201002699966</id><published>2009-04-12T19:51:00.000-07:00</published><updated>2009-04-12T19:55:21.073-07:00</updated><title type='text'>OpenXML SDK Version 2 April 2009 CTP</title><content type='html'>Some exciting news, the second CTP version of the OpenXML SDK v2 has been released.  Read the details over at &lt;a href="http://blogs.msdn.com/brian_jones/archive/2009/04/08/announcing-the-release-of-the-open-xml-sdk-version-2-april-2009-ctp.aspx"&gt;http://blogs.msdn.com/brian_jones/archive/2009/04/08/announcing-the-release-of-the-open-xml-sdk-version-2-april-2009-ctp.aspx&lt;/a&gt;.  Most exciting is the addition of schema level validation, this should drastically reduce invalid and corrupt files, something that has dogged me many times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-7188551201002699966?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/7188551201002699966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=7188551201002699966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/7188551201002699966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/7188551201002699966'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2009/04/openxml-sdk-version-2-april-2009-ctp.html' title='OpenXML SDK Version 2 April 2009 CTP'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-5981484999275171768</id><published>2008-12-16T07:51:00.000-08:00</published><updated>2008-12-16T07:59:08.166-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='SpreadsheetML'/><title type='text'>SpreadsheetML - Convert column integer index to column alpha value(i.e. A, AA, BH)</title><content type='html'>&lt;p&gt;Here's a quick snippet I found in a forum post at &lt;a href="http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa"&gt;http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa&lt;/a&gt;.  Many times in Excel I want to use a column index value instead of the letter representation(i.e A, AA, BH).  I don't have control of the Excel so I can't change the representation. This method returns the letter representation from an integer column value.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;pre class="c#:nogutter" style="FONT-SIZE: 10pt" name="code"&gt;&lt;br /&gt;protected string GetExcelColumnName(int columnNumber)&lt;br /&gt;        {&lt;br /&gt;            int dividend = columnNumber;&lt;br /&gt;            string columnName = String.Empty;&lt;br /&gt;            int modulo;&lt;br /&gt;&lt;br /&gt;            while (dividend &gt; 0)&lt;br /&gt;            {&lt;br /&gt;                modulo = (dividend - 1) % 26;&lt;br /&gt;                columnName = Convert.ToChar(65 + modulo).ToString() + columnName;&lt;br /&gt;                dividend = (int)((dividend - modulo) / 26);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return columnName;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-5981484999275171768?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/5981484999275171768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=5981484999275171768' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/5981484999275171768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/5981484999275171768'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2008/12/spreadsheetml-convert-column-integer.html' title='SpreadsheetML - Convert column integer index to column alpha value(i.e. A, AA, BH)'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-6181278004599835073</id><published>2008-12-16T07:19:00.000-08:00</published><updated>2008-12-16T07:48:21.233-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenXML'/><category scheme='http://www.blogger.com/atom/ns#' term='SpreadsheetML'/><title type='text'>SpreadsheetML - Retrieving SharedString values</title><content type='html'>Retrieving cell values in Excel spreadsheets is very straight forward, especially when string values are stored inline. Other times the string values are stored in the SharedStringTable collection. If the CellType is a SharedString. then the cell value references the index in the SharedStringTable. Below is a quick snippet that will return the SharedString value if that is the case, otherwise the inline string value.&lt;br /&gt;&lt;pre class="c#:nogutter" style="FONT-SIZE: 10pt" name="code"&gt;&lt;br /&gt;protected string GetCellValue(WorkbookPart wbPart, string targetCell)&lt;br /&gt;        {&lt;br /&gt;            string result = null;&lt;br /&gt;            WorksheetPart wsPart = wbPart.WorksheetParts.First();&lt;br /&gt;            SheetData sheetData = wsPart.Worksheet.GetFirstChild&lt;SheetData&gt;();&lt;br /&gt;            SharedStringTablePart sstPart = wbPart.GetPartsOfType&lt;SharedStringTablePart&gt;().First();&lt;br /&gt;            SharedStringTable ssTable = sstPart.SharedStringTable;&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                Cell cell = wsPart.Worksheet.Descendants&lt;Cell&gt;()&lt;br /&gt;                        .Where(c =&gt; targetCell.Equals(c.CellReference))&lt;br /&gt;                        .First();&lt;br /&gt;&lt;br /&gt;                if (cell.DataType != null &amp;&amp; cell.DataType == CellValues.SharedString)&lt;br /&gt;                {&lt;br /&gt;                    result = ssTable.ChildElements[Convert.ToInt32(cell.CellValue.Text)].InnerText;&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    if (cell.CellValue != null)&lt;br /&gt;                    {&lt;br /&gt;                        result = cell.CellValue.Text;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch (Exception)&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-6181278004599835073?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/6181278004599835073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=6181278004599835073' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/6181278004599835073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/6181278004599835073'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2008/12/spreadsheetml-retrieving-sharedstring.html' title='SpreadsheetML - Retrieving SharedString values'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-5897066445019574368</id><published>2008-11-10T16:20:00.000-08:00</published><updated>2008-11-11T14:20:23.463-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='PresentationML'/><category scheme='http://www.blogger.com/atom/ns#' term='Powerpoint'/><category scheme='http://www.blogger.com/atom/ns#' term='OOXML'/><title type='text'>Powerpoint spell check and text substitution problem</title><content type='html'>A situtation can occur when identifying substitution text in a presentation. In my example the text token is surrounded with a start/end token(i.e. [@token]). If the token is a word in the Office dictionary then there is no problem. On the other hand if the token word isn't in the dictionary and gets the red underline from spellcheck then Powerpoint breaks the string into multiple text runs. It's put into multiple runs because the spellchecked text has a RunProperty that identifies it as being a spelling error and must be repressented by the schema as such. The following will show the issue.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;Slide to be parsed&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_yxPsN-9CO-A/SRiuUSNUSJI/AAAAAAAAABA/j-qunaMY8Z0/s1600-h/tokenslide1.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267151427718105234" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 301px" alt="" src="http://4.bp.blogspot.com/_yxPsN-9CO-A/SRiuUSNUSJI/AAAAAAAAABA/j-qunaMY8Z0/s400/tokenslide1.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;Here's the breakdown of the text runs&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="BACKGROUND-COLOR: #ffffcc"&gt;Text Before: Token fun&lt;br /&gt;Text Before: Sometimes a [@Token] string will get broken up.&lt;br /&gt;Text Before: When spell check flags a misspelled word the&lt;br /&gt;Text Before: [@&lt;br /&gt;Text Before: MisspelledToken&lt;br /&gt;Text Before: ] gets split between multiple text blocks&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As you can see there is a token that gets spanned across multiple text runs and thus doesn't get replaced. This can be a major hang up. A quick solution for this one example is that I know when there is a start-token at the end of a text run then the next couple text runs are the token itself and then the end-token. So I can append those three together and then replace the token as necessary.&lt;br /&gt;&lt;br /&gt;&lt;pre class="c#:nogutter" style="FONT-SIZE: 10pt" name="code"&gt;&lt;br /&gt;void SubstituteText(SlidePart slidePart, string tokenStart, string tokenEnd, string tokenValue, string subValue)&lt;br /&gt;        {&lt;br /&gt;            string token = tokenStart + tokenValue + tokenEnd;&lt;br /&gt;            int tokenStartId = 0;&lt;br /&gt;&lt;br /&gt;            //Collect all the Paragraph sections containing the token&lt;br /&gt;            List&lt;drawing.paragraph&gt; paragraphList = slidePart.Slide&lt;br /&gt;                .Descendants&lt;drawing.paragraph&gt;()&lt;br /&gt;                .Where(t =&gt; t.InnerText.Contains(token)).ToList();&lt;br /&gt;&lt;br /&gt;            foreach (Drawing.Paragraph p in paragraphList)&lt;br /&gt;            {&lt;br /&gt;                //Collect all the Text&lt;br /&gt;                List&lt;drawing.text&gt; textList = p&lt;br /&gt;                    .Descendants&lt;drawing.text&gt;()&lt;br /&gt;                    .ToList();&lt;br /&gt;&lt;br /&gt;                //Iterate and find tokenStart Text block or replace text if whole token found&lt;br /&gt;                foreach (Drawing.Text t in new List&lt;drawing.text&gt;(p.Descendants&lt;drawing.text&gt;().ToList()))&lt;br /&gt;                {&lt;br /&gt;                    if (t.Text.EndsWith(tokenStart))&lt;br /&gt;                    {&lt;br /&gt;                        tokenStartId = textList.IndexOf(t);&lt;br /&gt;&lt;br /&gt;                        //append next two text segments and remove them&lt;br /&gt;                        Drawing.Text appendText = textList[tokenStartId + 1];&lt;br /&gt;                        t.Text = t.Text + appendText.Text;&lt;br /&gt;                        //must remove at the Drawing.Run level&lt;br /&gt;                        appendText.Parent.Remove();&lt;br /&gt;                        appendText = textList[tokenStartId + 2];&lt;br /&gt;                        t.Text = t.Text + appendText.Text;&lt;br /&gt;                        //must remove at the Drawing.Run level&lt;br /&gt;                        appendText.Parent.Remove();&lt;br /&gt;&lt;br /&gt;                        textList.RemoveAt(tokenStartId + 1);&lt;br /&gt;                        textList.RemoveAt(tokenStartId + 2);&lt;br /&gt;                    }&lt;br /&gt;                    //substitute text&lt;br /&gt;                    t.Text = t.Text.Replace(token, subValue);&lt;br /&gt;                }&lt;br /&gt;        &lt;br /&gt;            }&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After running this I get the following output as desired.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;.pptx after substitution&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_yxPsN-9CO-A/SRiuUSNUSJI/AAAAAAAAABA/j-qunaMY8Z0/s1600-h/tokenslide2.bmp"&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_yxPsN-9CO-A/SRnqXqad05I/AAAAAAAAABQ/N7Vc_ycDR-8/s1600-h/tokenslide2.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267498931429692306" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 300px" alt="" src="http://3.bp.blogspot.com/_yxPsN-9CO-A/SRnqXqad05I/AAAAAAAAABQ/N7Vc_ycDR-8/s400/tokenslide2.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;Breakdown of the text runs after substitution&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;div style="BACKGROUND-COLOR: #ffffcc"&gt;Text After: Token fun&lt;br /&gt;Text After: Sometimes a TOKEN string will get broken up.&lt;br /&gt;Text After: When spell check flags a misspelled word the&lt;br /&gt;Text After: BROKEN TOKEN gets split between multiple text blocks&lt;/div&gt;&lt;br /&gt;Now this doesn't cure all ails. I have also seen it where after going back and making changes to existing text that sometimes the start-token and token are together but the end-token is seperated to another text run. We also can't just take all the runs of a paragraph and smash them together into a single run and then substitute. This would ignore any text styling that was done within the paragraph. I have tried parsing a paragraph such that it looks at the RunProperties between consequetive runs to see if it's valid to append them together. I am still working on this and will present the final solution at a later time.&lt;br /&gt;&lt;br /&gt;Hopefully this post has revealed some nuances of doing text substitution and that it isn't always straight forward. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-5897066445019574368?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/5897066445019574368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=5897066445019574368' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/5897066445019574368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/5897066445019574368'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2008/11/powerpoint-spellcheck-and-text.html' title='Powerpoint spell check and text substitution problem'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yxPsN-9CO-A/SRiuUSNUSJI/AAAAAAAAABA/j-qunaMY8Z0/s72-c/tokenslide1.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-2687131271970119392</id><published>2008-10-29T18:56:00.000-07:00</published><updated>2008-10-29T20:21:53.249-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSC'/><category scheme='http://www.blogger.com/atom/ns#' term='OOXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>PSC participates at the DII Workshop in Redmond</title><content type='html'>Last week i attended the DII workshop in Redmond with &lt;a href="http://www.johndavidhead.com/jhead/johnhead.nsf"&gt;John Head&lt;/a&gt; and David Munaretto. We had a great opportunity to present our case study for server-side Powerpoint document generation as well as participate in discussions across many topics. Doug Mahugh has posted some great details about the entire &lt;a href="http://blogs.msdn.com/dmahugh/archive/2008/10/26/dii-workshop-recap.aspx"&gt;DII workshop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Topics covered ranged from document validator tools, document test library, document taxonomy, and OOXML development. This was my first time at a DII event and it was great to meet so many members of the Office product groups as well as other developers and "standards wonks" (credit for that description to &lt;a href="http://www.adjb.net/"&gt;Alex Brown&lt;/a&gt;). Interoperability dominates most the discussions, because in the end it's the users that matter most, not us developers. In this regard Microsoft is taking a nice step in attempting to approach the community not only with their successes, but also their weaknesses. Shawn Villaron was able share some examples of how they plan to document their format implementations to the public, creating an openess that will be much appreciated going forward.&lt;br /&gt;&lt;br /&gt;The highlight of the workshop for me was John and I presenting PSC's case study of server-side document generation (&lt;a href="http://www.johndavidhead.com/jhead/johnhead.nsf/dx/pscs-presentation-from-the-dii-workshop-this-past-week-microsoft"&gt;Click to view slides&lt;/a&gt;). I was very pleased with the all feedback we received from both the Microsoft groups as well as the other developers. It's exciting to be on the tip of an emerging technology, something that isn't always easy. Both the Powerpoint and OOXML teams listened to our frustrations and made it clear that they are there to help.&lt;br /&gt;&lt;br /&gt;My biggest gripe doing PPTX has been the lack of documentation and content that exists out on the web. Now that I have some scenarios that work i plan to try and fill that gap and help the community get on track using OOXML. I will be trying out some new functionality within the 2.0 SDK and will be posting my results. Some topics I plan to post about are content-substitution versus content-generation and where a good mix is between the two, conditional formatting within Powerpoint table data (not Excel sheets) as well as dealing with the finer aspects of Powerpoint including themes and smart art.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-2687131271970119392?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/2687131271970119392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=2687131271970119392' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/2687131271970119392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/2687131271970119392'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2008/10/psc-participates-at-dii-workshop-in.html' title='PSC participates at the DII Workshop in Redmond'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-7942417037193966190</id><published>2008-10-29T06:36:00.000-07:00</published><updated>2008-10-29T06:47:34.791-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Visual Studio 2010 and .NET 4.0 CTP available</title><content type='html'>Just got done moving into my new place, so I have been behind in getting my posts out about the DII workshop last week in Redmond, it's still coming. I wanted to pass this piece of news along if you haven't already seen. A Virtual PC image of VS 2010 with the 4.0 framework is available &lt;a href="https://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=9790"&gt;HERE&lt;/a&gt;. Microsoft is working hard getting feedback early and often, so go through the walkthroughs and post in the related forums. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-7942417037193966190?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/7942417037193966190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=7942417037193966190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/7942417037193966190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/7942417037193966190'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2008/10/visual-studio-2010-and-net-40-ctp.html' title='Visual Studio 2010 and .NET 4.0 CTP available'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1906568117185574156.post-5847675422974926860</id><published>2008-10-22T14:33:00.000-07:00</published><updated>2008-10-29T20:22:06.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSC'/><category scheme='http://www.blogger.com/atom/ns#' term='Powerpoint'/><category scheme='http://www.blogger.com/atom/ns#' term='OOXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>New Case Study for OOXML</title><content type='html'>PSC Group, LLC has published a case study for using OOXML, specifically for Powerpoint, as an enterprise reporting framework, click through to read.&lt;br /&gt;&lt;br /&gt;"&lt;a href="http://www.psclistens.com/enTouchCMS/FileUplFolder/Opening%20Access%20to%20Office%20Information%20with%20OOXML.pdf"&gt;Opening Access to Office Information with OOXML&lt;/a&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1906568117185574156-5847675422974926860?l=andrewschwantes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewschwantes.blogspot.com/feeds/5847675422974926860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1906568117185574156&amp;postID=5847675422974926860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/5847675422974926860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1906568117185574156/posts/default/5847675422974926860'/><link rel='alternate' type='text/html' href='http://andrewschwantes.blogspot.com/2008/10/new-case-study-for-ooxml.html' title='New Case Study for OOXML'/><author><name>Andrew Schwantes</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_yxPsN-9CO-A/SQkXbVO9WMI/AAAAAAAAAAM/KZFA6sJdGN8/S220/Tezzy+003.jpg'/></author><thr:total>0</thr:total></entry></feed>
