<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Cum Grano Salis</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/cumgranosalis/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/feed.xml</link>
    <description />
    <lastBuildDate>Fri, 24 Jul 2015 05:26:09 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>How to treat spaces/single quotes in Sheet names in REST</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/how-to-treat-spacessingle-quotes-in-sheet-names-in-rest</link>
      <pubDate>Tue, 05 Oct 2010 11:37:44 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/10/05/how-to-treat-spacessingle-quotes-in-sheet-names-in-rest/</guid>
      <description><![CDATA[When using REST to access portions of a workbook, people sometimes use direct addressing...]]></description>
      <content:encoded><![CDATA[<p>When using REST to access portions of a workbook, people sometimes use direct addressing (Sheet1!A1). I thought I’d drop a line about the icky way this works when you have single quotes in your sheet name.</p> <h4>Reminder…</h4> <p>First – a short reminder. This is how Excel Services REST works when trying to access a range:</p> <p><u>https://server/_vti_bin/ExcelRest.aspx/doclib/File.xlsx/Model/Ranges('sheet1!A1')?$format=html</u></p> <p>This will give back an HTML fragment representing the range. Now, what if sheet1 had a space in it? Say it was called <strong>Sheet 1</strong>?</p> <h4>Handling spaces in sheet names</h4> <p>The standard way of handling spaces in sheet names is to surround them in single quotes. And herein lies the problem – we already use single quotes to specify the range. The solution is to escape them (not URL escape – that will not help us). So here's what this looks like:</p> <p><u>https://server/_vti_bin/ExcelRest.aspx/doclib/File.xlsx/Model/Ranges('<strong>''sheet 1''</strong>!A1')?$format=html</u></p> <p>This may be a little unclear. Here's what's inside the braces:</p> <p>&lt;single quote-1&gt;&lt;single quote-2&gt;&lt;single quote-3&gt;sheet&lt;space&gt;1&lt;single quote-4&gt;&lt;single quote-5&gt;!A1&lt;single quote-6&gt;</p> <p>1 – Denotes the beginning of the range name.</p> <p>2,3 – the first single-quote in 'Sheet 1' encoded by doubling it.</p> <p>4,5 – the second single quote in Sheet 1' encoded by doubling it.</p> <p>6 – The end of the range name.</p> <h4>But wait.. It gets even uglier</h4> <p>What if the sheet name has a single quote in it? Say: Sheet '1 (that's <strong>Sheet&lt;space&gt;&lt;single quote&gt;1</strong>). In Excel, this would be represented in this fashion:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/73/metablogapi/1220.image_2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-52-73-metablogapi/1220.image_5F00_2.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/73/metablogapi/4760.image_thumb.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-52-73-metablogapi/4760.image_5F00_thumb.png" width="240" height="127" /></a></p> <p>See the double-single-quote in there? It's because Excel faces the same issue as we did in the previous example – it needs to escape the character. But what does that look like in REST?</p> <p>https://server/_vti_bin/ExcelRest.aspx/doclib/File.xlsx/Model/Ranges('<strong>''sheet ''''1''</strong>!A1')?$format=html</p> <p>Yeah. That's four single quotes in there…</p> <p>&lt;sq-1&gt;&lt;sq-2&gt;&lt;sq-3&gt;sheet&lt;space&gt;&lt;sq-4&gt;&lt;sq-5&gt;&lt;sq-6&gt;&lt;sq-7&gt;1&lt;sq-8&gt;&lt;sq-9&gt;!A1&lt;sq-10&gt;</p> <p>1 – Denotes the beginning of the range name.</p> <p>2,3 – the first single-quote in 'Sheet ''1' encoded by doubling it.</p> <p>4,5 – the second single quote character in 'Sheet ''1' encoded by doubling it.</p> <p>6, 7 – the third single quote character in 'Sheet ''1' encoded by doubling it.</p> <p>8, 9 – the fourth single quote character in 'Sheet ''1' encoded by doubling it.</p> <p>10 – The end of the range name.</p>]]></content:encoded>
    </item>
    <item>
      <title>It’s been a while… Welcome Windows Live Embedding!</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/its-been-a-while-welcome-windows-live-embedding</link>
      <pubDate>Thu, 23 Sep 2010 16:31:35 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/09/23/its-been-a-while-welcome-windows-live-embedding/</guid>
      <description><![CDATA[This has been a long time coming. But I finally have something new for you guys. It has been all...]]></description>
      <content:encoded><![CDATA[<p>This has been a long time coming. But I finally have something new for you guys. It has been all over the news/twitter/blogs by now, but one of the new features we added is the ability to embed Excel workbooks in your blogs/sites. There’s a pretty straightforward explanation about this here:</p> <p><a title="Embedding Excel Web App in your own web page or blog" href="https://blogs.msdn.com/b/excel/archive/2010/09/23/embedding-excel-web-app-in-your-own-web-page-or-blog.aspx">Embedding Excel Web App in your own web page or blog</a></p> <p>One of the interesting bits is that you can change the settings of what is shown by the viewer – whether it should show a specific item (range/chart etc) or if it should scroll to a specific location in the workbook etc. These options are pretty simple, but I thought it would be usful to create a simple helper that will let you pick the features you want and will build the customization string for you:</p><iframe height="400" src="https://r.office.microsoft.com/r/rlidExcelEmbed?su=-4860866720721724317&amp;Fi=SDBC8ABB78B2DD1C63!1073&amp;AllowInteractivity=True&amp;Item=Customizer&amp;AllowTyping=True&amp;ActiveCell=EWACustomizerForm!E9" frameborder="0" width="590" scrolling="no"></iframe> <p>All you have to do, is fill the orange cells and copy the appropriate string to your IFRAME embed code. Enjoy!</p> <p>Enjoy!</p>]]></content:encoded>
    </item>
    <item>
      <title>Restplorer – visual exploration tool for Excel Services 2010 REST capabilities</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/restplorer-visual-exploration-tool-for-excel-services-2010-rest-capabilities</link>
      <pubDate>Wed, 17 Feb 2010 13:59:28 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/02/17/restplorer-visual-exploration-tool-for-excel-services-2010-rest-capabilities/</guid>
      <description><![CDATA[At the beginning of the year, I wrote a little web app that lets you get embed code for REST...]]></description>
      <content:encoded><![CDATA[<p>At the beginning of the year, I wrote a little web app that lets you get embed code for REST URLs/elements in Excel Services in a very easy way – instead of crafting the URL yourself, or navigating through ATOM feeds, you get a nice UI to do that.</p> <p>Well.. Not really “nice” as much as an “eye sore” – the HTML was pretty awful. I elicited the help of one of our PMs (Manpratap Suri) to make the application look and behave like somebody a sane person would want to use. Once installed, the first step is to select the workbook you want the embed code for:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_2.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_2.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 20px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_thumb.png" width="700" height="517"></a></p> <p>The “Publish to web” option will show up, allowing the user to automatically navigate to the application page. Once clicked, the user is immediately dropped the application page:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_6.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_6.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 20px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_thumb_2.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_thumb_2.png" width="508" height="556"></a><br></p>  <p>There are five parts to this screen – at the top, there’s a huge “Publish to the web” title that should probably be made smaller. Then, below that, there are four elements you can choose from – charts, tables, PivotTables or ranges. To the left, below that, there’s a list of the available items (three items in the example above) and to the right is a preview image. Below the preview image, there are the available embed options – URL, HTML, Raw Data and DHTML.</p> <p>The user can now easily navigate between the type of elements the workbook exposes and between the actual elements exposed and easily pick what they want to use in their site.</p> <p>Clicking on “Tables” for example, will give the list of tables in the workbook:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_8.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_8.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; margin: 0px 20px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_thumb_3.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/RestplorervisualexplorationtoolforExcelS_BAFE/image_thumb_3.png" width="590" height="394"></a></p> <p>The interesting part though is the “Embed” code at the bottom. There are four options:</p> <p>* URL – this is the direct URL to the entity. Pasting this in the browser address box will directly navigate to the entity.</p> <p>* HTML – this is the HTML that represents the element. For charts, this is an &lt;img&gt; tag with the appropriate link (which means it will be refreshed every time the page containing it is loaded). For ranges/PivotTables and Tables, this is the actual HTML for the object (which means that it is “static” – it will not change).</p> <p>* DHTML – Only works for Ranges/PivotTables/Tables – this is is a piece of script and HTML that can be embedded – it will return the HTML for the requested element. Because this is brought in via AJAX every time the page loads, the data will always be current.</p> <p>* Raw Data – Only works for Ranges/PivotTables/Tables – this is the link to the raw data (values) of the requested element.</p> <p>In the next post, I am going to show how to use the various Embed options in SharePoint.</p>]]></content:encoded>
    </item>
    <item>
      <title>Excel Services Gadget download</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/excel-services-gadget-download</link>
      <pubDate>Tue, 16 Feb 2010 08:13:00 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/02/16/excel-services-gadget-download/</guid>
      <description><![CDATA[This is the download page for the Excel Services gadget described in these set of posts.
(Download...]]></description>
      <content:encoded><![CDATA[<P>This is the download page for the Excel Services gadget described in <A href="https://blogs.msdn.com/cumgranosalis/archive/tags/Excel+Services+Gadget/default.aspx" mce_href="https://blogs.msdn.com/cumgranosalis/archive/tags/Excel+Services+Gadget/default.aspx">these set of posts</A>.</P>
<P mce_keep="true">(Download link is right below this line - where it says "Attachments:")</P>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/96/43/79/ExGadget.gadget" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-09-96-43-79/ExGadget.gadget">ExGadget.gadget</a></p>]]></content:encoded>
    </item>
    <item>
      <title>“Scratch pad” mode in Excel Services 2010 – how to bring it back</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/scratch-pad-mode-in-excel-services-2010-how-to-bring-it-back</link>
      <pubDate>Mon, 08 Feb 2010 09:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/02/08/scratch-pad-mode-in-excel-services-2010-how-to-bring-it-back/</guid>
      <description><![CDATA[One of the things that were a side-effect of the massive re-write we did on the Excel Web Access...]]></description>
      <content:encoded><![CDATA[<P>One of the things that were a side-effect of the massive re-write we did on the Excel Web Access component (EWA) to enable editing scenarios and better scrolling was the fact that, when in view-mode, we could allow the user to type directly into the cells of the workbook (as opposed to the way we did it in 2007 where the only way to put values in was through the parameter tool-pane). When we gave out the code pre-Beta 1, when a user would choose “View in browser” on an Excel file, they would land in this mode – scratch-pad mode. This would be very similar to how things worked before (changes to the workbook would not be saved back to the document library) but users would be able to type in cells (as long as they have rights to the workbook).</P>
<P>Fast-forward to Beta 1, and our user testing showed that people got really confused by this mode – they expected the changes they typed in to be saved back into SharePoint. We took a close look at the scenario and a decision was taken to disable this sort of “read-only editing” to avoid the confusion. Now, the mode still exists and is easily accessible when using a web-part (you simply need to go to the web-part properties and check the “Allow typing” option there. But what of the full-screen viewer (the one the user lands in when they click “view in browser” or “edit in browser” on the drop down menu)?</P>
<P>Well, it turns out we also allow this mode in there – if you tack on “&amp;allowtyping=1” at the end of the URL, you will actually go back into scratch-pad mode and the user will be able to make modifications to the workbook in the grid, in the cells.</P>
<P>This is what it looks like:</P>
<P mce_keep="true">&nbsp;</P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_8.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_8.png" target=_blank mce_href="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_8.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; MARGIN: 0px 20px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_3.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_3.png" width=826 height=363 mce_src="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_3.png"></A><BR>
<P mce_keep="true">&nbsp;</P>
<P>Two things – in the URL box – you will see that I added the “&amp;allowtyping=1” parameter:</P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_10.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_10.png" target=_blank mce_href="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_10.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; MARGIN: 0px 20px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_4.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_4.png" width=344 height=158 mce_src="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_4.png"></A></P>
<P>You will also notice the small warning that comes up at the top of the grid, warning the user that changes made to the workbook will not be saved:</P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_12.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_12.png" target=_blank mce_href="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_12.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; MARGIN: 0px 20px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_5.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_5.png" width=812 height=69 mce_src="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/d68c93e110bc_7911/image_thumb_5.png"></A><BR></P>Enjoy!]]></content:encoded>
    </item>
    <item>
      <title>Charts based on dynamic ranges in Excel Services 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/charts-based-on-dynamic-ranges-in-excel-services-2010</link>
      <pubDate>Tue, 02 Feb 2010 13:52:00 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/02/02/charts-based-on-dynamic-ranges-in-excel-services-2010/</guid>
      <description><![CDATA[Hey folks, been asked about this a few times already, so thought I would post – if you are using any...]]></description>
      <content:encoded><![CDATA[<p>Hey folks, been asked about this a few times already, so thought I would post – if you are using any of the betas, you will notice that your charts based on dynamic ranges that used to work in 2007 no longer work. This has been fixed and will be available in the RTM bits. </p> <p>If you have any questions, feel free to comment. If you have sample workbooks that use charts based on dynamic ranges you can share, please send them to me, I will try to find some time to make sure they work.</p>]]></content:encoded>
    </item>
    <item>
      <title>How to get favorites listed when searching in the Start menu</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/how-to-get-favorites-listed-when-searching-in-the-start-menu</link>
      <pubDate>Tue, 05 Jan 2010 11:22:56 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2010/01/05/how-to-get-favorites-listed-when-searching-in-the-start-menu/</guid>
      <description><![CDATA[There aren’t many Vista features I am missing in Win7, but one that I most definitely miss is having...]]></description>
      <content:encoded><![CDATA[<p>There aren’t many Vista features I am missing in Win7, but one that I most definitely miss is having favorites appear when searching the start-menu. Now, you can add a favorites menu item to Start, but that’s not all that helpful for me – what I want is to be able to search in the Start text box and get the favorites that match.</p> <p>After asking around, here’s a method that works pretty damn well:</p> <p>1. Add a new library (right-click Libraries in explorer and click “New”).</p> <p>2. Add the Favorites folder to the library</p> <p>That’s it. Because libraries appear first in the start-menu, you will now see your favorites apprear in the start menu.</p>]]></content:encoded>
    </item>
    <item>
      <title>You can access arbitrary ranges via REST – here’s the trick</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/you-can-access-arbitrary-ranges-via-rest-heres-the-trick</link>
      <pubDate>Tue, 29 Dec 2009 13:24:23 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2009/12/29/you-can-access-arbitrary-ranges-via-rest-heres-the-trick/</guid>
      <description><![CDATA[Reader JJDE asked in this post if it was possible to access arbitrary ranges with REST – you just...]]></description>
      <content:encoded><![CDATA[<p>Reader JJDE asked in <a href="https://blogs.msdn.com/cumgranosalis/archive/2009/10/30/getting-ranges-via-excel-services-rest-as-well-as-charts-and-discovery.aspx#9942051">this post</a> if it was possible to access arbitrary ranges with REST – you just need to use a pipe character where you would usually place a colon:</p> <p>https://tsdlt2/_vti_bin/ExcelRest.aspx/Docs/Bugs.xlsx/Model/Ranges('Sheet1!A1|Z100') <p>This will return the Sheet1!A1:Z100 range. <p>As for why we had to do this.. IIS does not like colons in the path portion of a URL – any colon in the Path causes IIS to not allow the request to go through. Now, there’s a workaround to that by tweaking some registry key, but we did not want admins to do it nor did we want to do this automatically, so we decided to use the pipe symbol instead.</p>]]></content:encoded>
    </item>
    <item>
      <title>So what else can OpenXML + ASPX + Excel Services can do?</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/so-what-else-can-openxml-aspx-excel-services-can-do</link>
      <pubDate>Tue, 15 Dec 2009 09:22:00 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2009/12/15/so-what-else-can-openxml-aspx-excel-services-can-do/</guid>
      <description><![CDATA[In my previous post, I stole code that showed how developers can write code that will generate XLSX...]]></description>
      <content:encoded><![CDATA[<p>In my <a href="https://blogs.msdn.com/cumgranosalis/archive/2009/12/14/zeyad-rajabi-just-got-served-extending-the-reach-of-excel-services-with-the-open-xml-sdk-now-with-more-awesomness.aspx">previous post</a>, I <strike>stole code that</strike> showed how developers can write code that will generate XLSX files by using the fancy OpenXML SDK on the fly. At the end though, I explained how a workflow activity would have been much better for the scenario I presented, at least from a performance point of view.</p> <p>In this post, I will show the real power behind this pattern of generating files on the fly and feeding them to Excel Services. Instead of just using the data from the document library (the list of word documents), what if we enabled user input?</p> <p>If you recall, the URL I used in the previous post was this:</p> <p><a title="https://tsdlt2/_layouts/WorkbookGeneratorSample/SpecStatus.aspx" href="https://tsdlt2/_layouts/WorkbookGeneratorSample/SpecStatus.aspx">https://tsdlt2/_layouts/WorkbookGeneratorSample/SpecStatus.aspx</a></p> <p>And that produced the following chart:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_2.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_thumb.png" width="555" height="314"></a> </p> <p>But what if I only wanted people from my team – say only Chr<span>is S<span>tich and Greg Lindhorst?</span></span></p> <p><span><span>Here’s the URL I can pass in:</span></span></p> <p><span><span></span></span><a title="https://tsdlt2/_layouts/WorkbookGeneratorSample/SpecStatus.aspx" href="https://tsdlt2/_layouts/WorkbookGeneratorSample/SpecStatus.aspx?pm=Chris+Stich&amp;pm=Greg+Lindhorst">https://tsdlt2/_layouts/WorkbookGeneratorSample/SpecStatus.aspx?pm=Chris+Stich&amp;pm=Greg+Lindhorst</a></p> <p>In this case, the ASPX code will know how to look at the query-string and figure out what names I am interested in. Here’s the result:</p> <p></p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_4.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/SowhatelsecanOpenXMLASPXExcelServicescan_148D8/image_thumb_1.png" width="560" height="312"></a> </p> <p>The way this works is very easy. Zayed’s original code would look through the entire list of documents in the SharePoint document library and generate a chart out of all of them. I added code, essentially, in three places. First, when loading the page, I figure out what names need to appear:</p> <div style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; background: #f2f2f2; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242"> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; color: blue; font-size: 9.5pt">protected</span><span style="font-family: consolas; font-size: 9.5pt"> <span style="color: blue">void</span> Page_Load(<span style="color: blue">object</span> sender, <span style="color: #2b91af">EventArgs</span> e)<?xml:namespace prefix = o /><o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt">{<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: #2b91af">HttpContext</span> ctx = <span style="color: #2b91af">HttpContext</span>.Current;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="background: yellow; color: blue; mso-highlight: yellow">string</span><span style="background: yellow; mso-highlight: yellow">[] names = ctx.Request.QueryString.GetValues(<span style="color: #a31515">"pm"</span>);</span><o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><o:p>&nbsp;</o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">byte</span>[] buffer = GenerateWorkbookSteam(<span style="background: yellow; mso-highlight: yellow">names</span>);<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><o:p>&nbsp;</o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.Clear();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.ContentType = <span style="color: #a31515">"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"</span>;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.Headers.Add(<span style="color: #a31515">"LAST-MODIFIED"</span>, <span style="color: #2b91af">DateTime</span>.Now.ToString(<span style="color: #a31515">"R"</span>));<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.OutputStream.Write(buffer, <span style="color: brown">0</span>, buffer.Length);<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.OutputStream.Flush();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.End();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt">}<o:p></o:p></span></p></div> <p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><o:p>&nbsp;</o:p></span></p> <p></p> <p></p> <p>Then, when deciding on whether or not to add rows to the workbook, I make sure we only add the rows if the PMs are on the URL (or if there’s nothing on the URL (note that most of the code is in <a href="https://blogs.msdn.com/brian_jones/archive/2009/12/03/extending-the-reach-of-excel-services-with-the-open-xml-sdk.aspx">Zeyad’s original post</a> – I am just showing what I modified here):<span><span></p> <div style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; background: #f2f2f2; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242"> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; color: green; font-size: 9.5pt">//Go through our spec hashtable so we can add the data to workbook</span><span style="font-family: consolas; font-size: 9.5pt"><o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; color: #2b91af; font-size: 9.5pt">IDictionaryEnumerator</span><span style="font-family: consolas; font-size: 9.5pt"> enumerator = specTable.GetEnumerator();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; color: blue; font-size: 9.5pt">while</span><span style="font-family: consolas; font-size: 9.5pt"> (enumerator.MoveNext())<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt">{<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">string</span> pmName = (<span style="color: blue">string</span>)enumerator.Key;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="background: yellow; color: blue; mso-highlight: yellow">if</span><span style="background: yellow; mso-highlight: yellow"> (names != <span style="color: blue">null</span> &amp;&amp; names.Length &gt; <span style="color: brown">0</span> &amp;&amp; !names.Contains(pmName, <span style="color: #2b91af">StringComparer</span>.OrdinalIgnoreCase))<o:p></o:p></span></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; background: yellow; font-size: 9.5pt; mso-highlight: yellow"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; background: yellow; font-size: 9.5pt; mso-highlight: yellow"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">continue</span>;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; background: yellow; font-size: 9.5pt; mso-highlight: yellow"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}</span><span style="font-family: consolas; font-size: 9.5pt"><o:p></o:p></span></p></div> <p>The highlighted area is the one that was added – it simply looking at the names that were passed in as URL parameters, and if the name currently being procesed (<em>pmName</em>) is not one of them, it ignores the set of documents and does not add the row to Excel.</p> <p>Finally, Zayed’s <em>FixChartData()</em> method had to be tweaked to make sure the chart has the correct amount of elements:</p> <p>&nbsp;</p> <div style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; background: #f2f2f2; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242"> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; color: blue; font-size: 9.5pt">void</span><span style="font-family: consolas; font-size: 9.5pt"> FixChartData(<span style="color: #2b91af">WorksheetPart</span> worksheetPart, <span style="color: #2b91af">Hashtable</span> specTable, <span style="color: blue">string</span>[] names)<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt">{<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><span style="color: blue">int</span> totalCount = specTable.Count + <span style="color: brown">1</span>;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="background: yellow; color: blue; mso-highlight: yellow">if</span><span style="background: yellow; mso-highlight: yellow"> (names != <span style="color: blue">null</span> &amp;&amp; names.Length &gt; <span style="color: brown">0</span>)<o:p></o:p></span></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; background: yellow; font-size: 9.5pt; mso-highlight: yellow"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; background: yellow; font-size: 9.5pt; mso-highlight: yellow"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>totalCount = names.Length + <span style="color: brown">1</span>;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; background: yellow; font-size: 9.5pt; mso-highlight: yellow"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}</span><span style="font-family: consolas; font-size: 9.5pt"><o:p></o:p></span></p></div> <p>And that’s about it! All in all, we added about 12 lines of code to the original code developed by Zeyad and we have a solution that allows us to target exactly which PMs we want to look at.</p> <p>In the posts to come, I will show more tricks and uses for this idea of generating Excel workbooks on the fly.</p>]]></content:encoded>
    </item>
    <item>
      <title>Zeyad Rajabi just got served – Extending the reach of Excel Services with the Open XML SDK – now with more awesomness</title>
      <link>https://docs.microsoft.com/archive/blogs/cumgranosalis/zeyad-rajabi-just-got-served-extending-the-reach-of-excel-services-with-the-open-xml-sdk-now-with-more-awesomness</link>
      <pubDate>Mon, 14 Dec 2009 08:49:00 GMT</pubDate>
      <dc:creator><![CDATA[Shahar Prish]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cumgranosalis/2009/12/14/zeyad-rajabi-just-got-served-extending-the-reach-of-excel-services-with-the-open-xml-sdk-now-with-more-awesomness/</guid>
      <description><![CDATA[A few days ago, Zeyad Rajabi posted a really nice post about using OpenXML with Excel Services. His...]]></description>
      <content:encoded><![CDATA[<p>A few days ago, Zeyad Rajabi posted a really nice post about <a href="https://blogs.msdn.com/brian_jones/archive/2009/12/03/extending-the-reach-of-excel-services-with-the-open-xml-sdk.aspx">using OpenXML with Excel Services</a>. His solution showed an Excel chart that you use to update a workbook and generate a chart showing, in the case of his example, the status of specs in his group.</p> <p>When I saw this post, I decided to ‘one up’ it and give my spin on it, and by that introduce one of the less known new features in Excel Services on SharePoint 2010 – the ability to point Excel Services at any URL that returns a workbook – not specifically ones that are extensioned as such. More on the general case in a later post. This post will show how we can take Zeyad’s solution and turn it into a dynamic solution.</p> <p>To summarize Zeyad’s solution – the idea is to have a chart in Excel represent how many “open issues” a list of specs have for each PM in the team, furthermore broken out by what stage the document is in. The owner of the document is deduced from document properties and the amount of “open issues” is deduced from looking at the Word file and searching for a specific style applied to paragraphs (we have a special style for marking opened issues). If you read Zeyad’s great post, you will see the work done there – essentially, you have a web-part where you click on an “Update” button and that generates the new workbook (with the updated chart) and saves it into SharePoint. Here’s a screen-shot I pilfered from Zeyad’s post:</p> <p><a href="https://zeyadrajabi.members.winisp.net/ExtendingtheReachofExcelServiceswiththeO_BDD8/image_9.png"><img title="image" border="0" alt="image" src="https://zeyadrajabi.members.winisp.net/ExtendingtheReachofExcelServiceswiththeO_BDD8/image_thumb_9.png" width="497" height="366"></a></p> <p>You can see the little buttons above the chart – you click the left one to cause the chart to get regenerated and then on the right one to cause the chart on the page to display.</p> <p>Here’s what my solution looks like (I have less specs in my library, so my graph is less impressive):</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_2.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_thumb.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_thumb.png" width="588" height="484"></a> </p> <p>Note the missing “Update” button. So how does the workbook get updated? To understand that, it’s important to see what the URL is that the EWA is looking at:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_4.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/image_thumb_1.png" width="462" height="207"></a> </p> <p>As you can see, the workbook URL is pointing to an aspx page. “That’s tom-foolery!” I can hear you crying. Not quite. Here’s the code in the ASPX page:</p> <div style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt; background: #f2f2f2; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 1pt; mso-element: para-border-div; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242"> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; color: blue; font-size: 9.5pt">protected</span><span style="font-family: consolas; font-size: 9.5pt"> <span style="color: blue">void</span> Page_Load(<span style="color: blue">object</span> sender, <span style="color: #2b91af">EventArgs</span> e)<?xml:namespace prefix = o /><o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt">{<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: #2b91af">HttpContext</span> ctx = <span style="color: #2b91af">HttpContext</span>.Current;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">string</span>[] names = null;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><o:p>&nbsp;</o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">byte</span>[] buffer = GenerateWorkbookSteam(names);<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><o:p>&nbsp;</o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.Clear();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span>ctx.Response.ContentType = <span style="color: #a31515">"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"</span>;<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.Headers.Add(<span style="color: #a31515">"LAST-MODIFIED"</span>, <span style="color: #2b91af">DateTime</span>.Now.ToString(<span style="color: #a31515">"R"</span>));<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.OutputStream.Write(buffer, <span style="color: brown">0</span>, buffer.Length);<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.OutputStream.Flush();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ctx.Response.End();<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt">}<o:p></o:p></span></p> <p style="border-bottom: medium none; border-left: medium none; padding-bottom: 0in; line-height: normal; padding-left: 0in; padding-right: 0in; margin-bottom: 0pt; background: #f2f2f2; border-top: medium none; border-right: medium none; padding-top: 0in; mso-border-alt: solid windowtext .5pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" class="MsoNormal"><span style="font-family: consolas; font-size: 9.5pt"><o:p>&nbsp;</o:p></span></p></div> <p class="MsoNormal"><o:p>&nbsp;</o:p></p> <p>The call to <em>GenerateWorkbookStream()</em> is essentially the method called <em>btnSubmit_Click() </em>in Zeyad's post with very little change – instead of saving the binary stream back into SharePoint, <em>GenerateWorkbookStream() </em>returns the byte array to the caller.</p> <p>What we do with that byte array is write it as the response to the ASPX page (that’s where we make the call to <em>ctx.Response.OutputStream.Write())</em>. The other important parts are the headers we set and the call to <em>Response.End()</em>&nbsp; which finishes the call and returns the result to the caller. </p> <p>The other two lines are where we set the header for the response. First, we set the content-type to be that long string which is the content type of an OpenXML Spreadsheet file. The second one we set is the “LAST-MODIFIED” which is required for Excel Services to process the file (the file would not be loaded if this header is not set).</p> <p>That’s it – the rest of the code is pretty much the same. Here’s a diagram of what happens:</p> <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/AspxExcelFile_4.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/AspxExcelFile_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="AspxExcelFile" border="0" alt="AspxExcelFile" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/AspxExcelFile_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/cumgranosalis/WindowsLiveWriter/ZeyadRajabijustgotservedExtendingthereac_1411D/AspxExcelFile_thumb_1.png" width="644" height="484"></a> </p> <p>When I told Zeyad I was going to post about this, we talked a bit about the solution, and he pointed out that, much better than my solution or his, it would have been nice to have a workflow that actually updated the workbook whenever a word document was updated in the doc lib. That way, we only regenerate the workbook when we need. The next post I will make will show how the dynamic workbook solution can do so much more.</p>]]></content:encoded>
    </item>
  </channel>
</rss>