<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Joel&#039;s SharePoint Architect Blog &#187; Excel Services</title> <atom:link href="http://joelblogs.co.uk/tag/excel-services/feed/" rel="self" type="application/rss+xml" /><link>http://joelblogs.co.uk</link> <description>SharePoint 2010, MOSS &#38; WSS Tips and Consultancy Tales</description> <lastBuildDate>Wed, 07 Mar 2012 10:15:28 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=325</generator> <item><title>SharePoint 2010 Developer Courses and Business Intelligence in SharePoint 2010</title><link>http://joelblogs.co.uk/2010/07/22/sharepoint-2010-developer-courses-and-business-intelligence-in-sharepoint-2010/</link> <comments>http://joelblogs.co.uk/2010/07/22/sharepoint-2010-developer-courses-and-business-intelligence-in-sharepoint-2010/#comments</comments> <pubDate>Thu, 22 Jul 2010 11:22:33 +0000</pubDate> <dc:creator>Joel Jeffery</dc:creator> <category><![CDATA[SharePoint]]></category> <category><![CDATA[Training]]></category> <category><![CDATA[Business Intelligence]]></category> <category><![CDATA[Charting]]></category> <category><![CDATA[Excel Services]]></category> <category><![CDATA[Excel Web Access]]></category> <category><![CDATA[SharePoint 2010]]></category> <category><![CDATA[SharePoint Videos]]></category> <category><![CDATA[Videos]]></category><guid
isPermaLink="false">http://joelblogs.co.uk/?p=10169</guid> <description><![CDATA[<p>Over the next few weeks I’m building the new <a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5maXJlYnJhbmR0cmFpbmluZy5jby51ay9jb3Vyc2VzL21pY3Jvc29mdC9tY3RzLW1jcGQtc2hhcmVwb2ludC1kZXZlbG9wZXI=" rel=\"nofollow\" target=\"_blank\">SharePoint 2010 Developer Course</a> for <a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5maXJlYnJhbmR0cmFpbmluZy5jby51aw==" rel=\"nofollow\" target=\"_blank\">Firebrand Training</a>. These are exciting times for SharePoint 2007 (MOSS and WSS 3.0) developers looking to acquire new skills.</p><p>The Microsoft SharePoint 2010 platform has really come of age. In my three recent video podcasts, I showed some of my favourite features in SharePoint 2010:</p><ul><li><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzA0LzAxL3NoYXJlcG9pbnQtMjAxMC1lbmFibGluZy1idXNpbmVzcy1hZ2lsaXR5LXdpdGgtd29ya2Zsb3cv" target=\"_blank\">SharePoint 2010 Enabling Business Agility using Workflow</a></li><li><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzAxLzI1L3NoYXJlcG9pbnQtMjAxMC1idXNpbmVzcy1jb25uZWN0aXZpdHktc2VydmljZXMtYW5kLW9mZmxpbmUtc3luY2hyb25pc2F0aW9uLSVlMiU4MCU5My1kZXZlbG9wZXItdmlkZW8taG93LXRvLw==" target=\"_blank\">SharePoint 2010 Business Connectivity Services and Offline Synchronisation</a></li><li><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzAxLzE1L3NoYXJlcG9pbnQtMjAxMC1zb2x1dGlvbi1zYW5kYm94LSVlMiU4MCU5My1kZXZlbG9wZXItaG93LXRvLw==" target=\"_blank\">SharePoint 2010 Sandbox Solutions</a></li></ul><p>But there’s so much more for the SharePoint Developer to enjoy!</p><ul><li>Visual Studio 2010 SharePoint Projects and Project Items</li></ul><p><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzA3LzIyL3NoYXJlcG9pbnQtMjAxMC1kZXZlbG9wZXItY291cnNlcy1hbmQtYnVzaW5lc3MtaW50ZWxsaWdlbmNlLWluLXNoYXJlcG9pbnQtMjAxMC8=" class=\"more-link\">Read more on SharePoint 2010 Developer Courses and Business Intelligence in SharePoint 2010&#8230;</a></p> <img
src="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&#038;post_id=10169" width="1" height="1" style="display: none;" /><p
class='technorati-tags'>Technorati Tags: <a
class='technorati-link' href='http://technorati.com/tag/Business+Intelligence' rel='tag,nofollow' target='_blank'>Business Intelligence</a>, <a
class='technorati-link' href='http://technorati.com/tag/Charting' rel='tag,nofollow' target='_blank'>Charting</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Services' rel='tag,nofollow' target='_blank'>Excel Services</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Web+Access' rel='tag,nofollow' target='_blank'>Excel Web Access</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint+2010' rel='tag,nofollow' target='_blank'>SharePoint 2010</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint+Videos' rel='tag,nofollow' target='_blank'>SharePoint Videos</a>, <a
class='technorati-link' href='http://technorati.com/tag/Training' rel='tag,nofollow' target='_blank'>Training</a>, <a
class='technorati-link' href='http://technorati.com/tag/Videos' rel='tag,nofollow' target='_blank'>Videos</a></p>]]></description> <content:encoded><![CDATA[<p>Over the next few weeks I’m building the new <a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5maXJlYnJhbmR0cmFpbmluZy5jby51ay9jb3Vyc2VzL21pY3Jvc29mdC9tY3RzLW1jcGQtc2hhcmVwb2ludC1kZXZlbG9wZXI=" rel=\"nofollow\" target=\"_blank\">SharePoint 2010 Developer Course</a> for <a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5maXJlYnJhbmR0cmFpbmluZy5jby51aw==" rel=\"nofollow\" target=\"_blank\">Firebrand Training</a>. These are exciting times for SharePoint 2007 (MOSS and WSS 3.0) developers looking to acquire new skills.</p><p>The Microsoft SharePoint 2010 platform has really come of age. In my three recent video podcasts, I showed some of my favourite features in SharePoint 2010:</p><ul><li><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzA0LzAxL3NoYXJlcG9pbnQtMjAxMC1lbmFibGluZy1idXNpbmVzcy1hZ2lsaXR5LXdpdGgtd29ya2Zsb3cv" target=\"_blank\">SharePoint 2010 Enabling Business Agility using Workflow</a></li><li><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzAxLzI1L3NoYXJlcG9pbnQtMjAxMC1idXNpbmVzcy1jb25uZWN0aXZpdHktc2VydmljZXMtYW5kLW9mZmxpbmUtc3luY2hyb25pc2F0aW9uLSVlMiU4MCU5My1kZXZlbG9wZXItdmlkZW8taG93LXRvLw==" target=\"_blank\">SharePoint 2010 Business Connectivity Services and Offline Synchronisation</a></li><li><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDEwLzAxLzE1L3NoYXJlcG9pbnQtMjAxMC1zb2x1dGlvbi1zYW5kYm94LSVlMiU4MCU5My1kZXZlbG9wZXItaG93LXRvLw==" target=\"_blank\">SharePoint 2010 Sandbox Solutions</a></li></ul><p>But there’s so much more for the SharePoint Developer to enjoy!</p><ul><li>Visual Studio 2010 SharePoint Projects and Project Items</li><li>Client Object Model (for .NET, Sliverlight and JavaScript)</li><li>LINQ to SharePoint</li><li>Solution and Feature Lifecycle with the Versioning and Upgrade Framework</li><li>SharePoint Designer 2010 and Visio 2010 Integration</li><li>InfoPath 2010 Forms</li><li>Claims Based Security</li><li>SharePoint Powershell Integration</li><li>Lists and Libraries Enhancements</li><li>Branding Improvements</li><li>Enterprise Content Management Improvements, Taxonomies</li><li>Search Improvements</li><li>Excel Services, PerformancePoint Services, PowerPivot for SharePoint</li><li>Access Services</li><li>Office Web Access</li><li>…More! More! More!</li></ul><p>To round off my week as the <a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2Jsb2cuZmlyZWJyYW5kdHJhaW5pbmcuY28udWsv" rel=\"nofollow\" target=\"_blank\">Firebrand Blog</a> guest blogger, I’ve made a high level video overview of some of the new Business Intelligence features in SharePoint 2010. A quick look at the Business Intelligence Center site definition, a look at Excel Web Access and the Excel Web Access Web Part, and finally a peek at the REST API for Excel Services.</p><p> <embed
src="http://blip.tv/play/hYVegfCBCQA" type="application/x-shockwave-flash" width="500" height="375" allowscriptaccess="always" allowfullscreen="true"></embed><p>&#160;</p><p>Don’t forget you can find all my videos as podcasts on iTunes! Just search for “joelblogs tv” and you’ll find them.</p> <img
src="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=10169" width="1" height="1" style="display: none;" /><p
class='technorati-tags'>Technorati Tags: <a
class='technorati-link' href='http://technorati.com/tag/Business+Intelligence' rel='tag,nofollow' target='_blank'>Business Intelligence</a>, <a
class='technorati-link' href='http://technorati.com/tag/Charting' rel='tag,nofollow' target='_blank'>Charting</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Services' rel='tag,nofollow' target='_blank'>Excel Services</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Web+Access' rel='tag,nofollow' target='_blank'>Excel Web Access</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint+2010' rel='tag,nofollow' target='_blank'>SharePoint 2010</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint+Videos' rel='tag,nofollow' target='_blank'>SharePoint Videos</a>, <a
class='technorati-link' href='http://technorati.com/tag/Training' rel='tag,nofollow' target='_blank'>Training</a>, <a
class='technorati-link' href='http://technorati.com/tag/Videos' rel='tag,nofollow' target='_blank'>Videos</a></p>]]></content:encoded> <wfw:commentRss>http://joelblogs.co.uk/2010/07/22/sharepoint-2010-developer-courses-and-business-intelligence-in-sharepoint-2010/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>WSS 3.0 and MOSS 2007 tips #5 – Popular Misconceptions – Excel Services UDFs and Excel Client 2007</title><link>http://joelblogs.co.uk/2009/03/18/wss-3-0-and-moss-2007-tips-5-popular-misconceptions-%e2%80%93-excel-services-udfs-and-excel-client-2007/</link> <comments>http://joelblogs.co.uk/2009/03/18/wss-3-0-and-moss-2007-tips-5-popular-misconceptions-%e2%80%93-excel-services-udfs-and-excel-client-2007/#comments</comments> <pubDate>Wed, 18 Mar 2009 11:42:00 +0000</pubDate> <dc:creator>Joel Jeffery</dc:creator> <category><![CDATA[SharePoint]]></category> <category><![CDATA[Excel]]></category> <category><![CDATA[Excel Add-ins]]></category> <category><![CDATA[Excel Services]]></category> <category><![CDATA[MOSS 2007]]></category> <category><![CDATA[Office Server]]></category> <category><![CDATA[SharePoint Architecture]]></category> <category><![CDATA[UDF]]></category> <category><![CDATA[User Defined Functions]]></category><guid
isPermaLink="false">http://joelj.co.uk/?p=9986</guid> <description><![CDATA[<p><em>Back in my first blog posting on WSS 3.0 and MOSS 2007, I discussed Excel Services and User Defined Functions. Since then I have had a number of requests for a follow up post. A common misconception from students in my </em><a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5qZmRpcGhvZW5peC5jby51ay9zaGFyZXBvaW50K3RyYWluaW5nLmFzcHg="><em>SharePoint</em></a><em> developer courses is this:</em></p><blockquote><p><strong>Popular Misconception #1: </strong>“I can’t test my UDFs in Excel! When I write a UDF class and method, my spreadsheet works on the server, but I get <strong><em>#NAME?</em></strong> showing up when I try to build my spreadsheet in Excel on my desktop.”</p></blockquote><p>This is kind of true. A UDF is just a .NET assembly that has bee appropriately attributed to mark the Class and Methods as discoverable and usable by Excel Services. You deploy this to Excel Services by installing it in the GAC on the server and registering it in the Shared Service Provider (SSP) for Excel Services.</p><p><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDA5LzAzLzE4L3dzcy0zLTAtYW5kLW1vc3MtMjAwNy10aXBzLTUtcG9wdWxhci1taXNjb25jZXB0aW9ucy0lZTIlODAlOTMtZXhjZWwtc2VydmljZXMtdWRmcy1hbmQtZXhjZWwtY2xpZW50LTIwMDcv" class=\"more-link\">Read more on WSS 3.0 and MOSS 2007 tips #5 – Popular Misconceptions – Excel Services UDFs and Excel Client 2007&#8230;</a></p> <img
src="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&#038;post_id=9986" width="1" height="1" style="display: none;" /><p
class='technorati-tags'>Technorati Tags: <a
class='technorati-link' href='http://technorati.com/tag/Excel' rel='tag,nofollow' target='_blank'>Excel</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Add-ins' rel='tag,nofollow' target='_blank'>Excel Add-ins</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Services' rel='tag,nofollow' target='_blank'>Excel Services</a>, <a
class='technorati-link' href='http://technorati.com/tag/MOSS+2007' rel='tag,nofollow' target='_blank'>MOSS 2007</a>, <a
class='technorati-link' href='http://technorati.com/tag/Office+Server' rel='tag,nofollow' target='_blank'>Office Server</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint' rel='tag,nofollow' target='_blank'>SharePoint</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint+Architecture' rel='tag,nofollow' target='_blank'>SharePoint Architecture</a>, <a
class='technorati-link' href='http://technorati.com/tag/UDF' rel='tag,nofollow' target='_blank'>UDF</a>, <a
class='technorati-link' href='http://technorati.com/tag/User+Defined+Functions' rel='tag,nofollow' target='_blank'>User Defined Functions</a></p>]]></description> <content:encoded><![CDATA[<p><em>Back in my first blog posting on WSS 3.0 and MOSS 2007, I discussed Excel Services and User Defined Functions. Since then I have had a number of requests for a follow up post. A common misconception from students in my </em><a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5qZmRpcGhvZW5peC5jby51ay9zaGFyZXBvaW50K3RyYWluaW5nLmFzcHg="><em>SharePoint</em></a><em> developer courses is this:</em></p><blockquote><p><strong>Popular Misconception #1: </strong>“I can’t test my UDFs in Excel! When I write a UDF class and method, my spreadsheet works on the server, but I get <strong><em>#NAME?</em></strong> showing up when I try to build my spreadsheet in Excel on my desktop.”</p></blockquote><p>This is kind of true. A UDF is just a .NET assembly that has bee appropriately attributed to mark the Class and Methods as discoverable and usable by Excel Services. You deploy this to Excel Services by installing it in the GAC on the server and registering it in the Shared Service Provider (SSP) for Excel Services.</p><p>Excel Client 2007, on the other hand, does not know what to do with these .NET assemblies. You can try adding these .DLLs as Excel Add-Ins or COM Add-Ins and Excel will complain that your assembly is not a valid add-in.</p><p><a
rel=\"nofollow\" rel=\"WLPP\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cHM6Ly9tYTJhYXcuYmx1LmxpdmVmaWxlc3RvcmUuY29tL3kxbWhtMW1ZNi1Ldkl6OVBXQUxVRzRYbXBKR2x4ZW14R2FZX1dOMzlQanpXQUZ3RzRpaFZOUTRFLWFsWVBDRE9vVF9LQVFaUVI1NUxMWjFsQjVHOExkWlg2MkZOamtBdmo3ZmcyWWxWMmYyQU5NbVNLN25rMUQ3UjUzbWlHTlpYNzdtS1FFU2NLQjZWTkUvaW1hZ2VbM10ucG5n"><img
style="display: inline; border-width: 0px;" title="Click to zoom! Not a valid Excel add-in!" src="http://cdn.joelblogs.com/wp-content/uploads/2010/08/image_thumb1.png" border="0" alt="Click to zoom! Not a valid Excel add-in!" width="445" height="111" /></a></p><p>So how do we work around this? Some say you can wrap your .NET assembly in a .XLL library written in C++. Some say there are third party wrappers that will do this for you at a premium.</p><p>You don’t need to go that far.</p><p>Let’s have a look at a simple (trivially so) UDF for Excel Services.</p><div
style="font-size: 8pt; margin: 20px 0px 10px; overflow: auto; width: 97.5%; cursor: text; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border: gray 1px solid; padding: 4px;"><div
style="font-size: 8pt; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   1:</span> <span style="color: #0000ff;">namespace</span> JoelsUDF</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   2:</span> {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   3:</span> <span style="color: #008000;">// Mark this class as an Excel Services UDF</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   4:</span>     [UdfClass]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   5:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> JoelsUDFClass</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   6:</span>     {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   7:</span> <span style="color: #cc6633;">#region</span> UDF bits</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   8:</span> <span style="color: #008000;">/// &lt;summary&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   9:</span> <span style="color: #008000;">/// My very complex UDF method... </span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  10:</span> <span style="color: #008000;">/// &lt;/summary&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  11:</span> <span style="color: #008000;">/// &lt;param name="value"&gt;Some number.&lt;/param&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  12:</span> <span style="color: #008000;">/// &lt;returns&gt;Passed in value inc
remented by one.&lt;/returns&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  13:</span> <span style="color: #008000;">// Mark this method as an Excel Services UDF method</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  14:</span>         [UdfMethod]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  15:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> AddOne(<span style="color: #0000ff;">double</span> <span style="color: #0000ff;">value</span>)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  16:</span>         {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  17:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">value</span> + 1;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  18:</span>         }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  19:</span> <span style="color: #cc6633;">#endregion</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  20:</span>     }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  21:</span> }</pre></div></div><p>Very, very simply, this marks the class as a UdfClass, with a single UdfMethod that takes a double and returns the value incremented by one. This can be signed and deployed into Excel Services using the method described in my previous post on <a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxqLnNwYWNlcy5saXZlLmNvbS9ibG9nL2NucyE0OTNCMjI1QkFCMEU2QTYxITQzMS5lbnRyeQ==">Excel Services and UDFs</a>.</p><p>If I now want to deploy this same assembly into Excel Client 2007 as an add-in, I could add a few lines of COM registration code. Once again, don’t forget to sign your assembly!</p><div
style="font-size: 8pt; margin: 20px 0px 10px; overflow: auto; width: 97.5%; cursor: text; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border: gray 1px solid; padding: 4px;"><div
style="font-size: 8pt; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   1:</span> <span style="color: #0000ff;">namespace</span> JoelsUDF</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   2:</span> {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   3:</span> <span style="color: #008000;">// Mark this class as visible in COM</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   4:</span>     [ProgId(JoelsUDFClass.ProgID)]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   5:</span>     [Guid(JoelsUDFClass.ClassID)]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   6:</span>     [ClassInterface(ClassInterfaceType.AutoDual)]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   7:</span>     [ComVisible(<span style="color: #0000ff;">true</span>)]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   8:</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   9:</span> <span style="color: #008000;">// Mark this class as an Excel Services UDF</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  10:</span>     [UdfClass]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  11:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> JoelsUDFClass</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  12:</span>     {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  13:</span> <span style="color: #cc6633;">#region</span> COM bits</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  14:</span> <span style="color: #008000;">// COM ClassID (GUID) and ProgID (Type Name)</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  15:</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">string</span> ClassID = <span style="color: #006080;">"81FCB6CB-E4F1-4728-A6A7-8BBA85D0B5EA"</span>;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  16:</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">string</span> ProgID = <span style="color: #006080;">"JoelsUDF.JoelsUDFClass"</span>;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  17:</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: non e; padding: 0px;"><span style="color: #606060;">  18:</span> <span style="color: #008000;">// Registers COM class in the registry</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  19:</span>         [ComRegisterFunction]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  20:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> RegistrationMethod(Type type)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  21:</span>         {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  22:</span> <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">typeof</span>(JoelsUDFClass) == type)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  23:</span>             {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  24:</span>                 RegistryKey regKey = Registry.ClassesRoot.CreateSubKey(</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  25:</span> <span style="color: #006080;">"CLSID\\{"</span> + ClassID + <span style="color: #006080;">"}\\Programmable"</span>);</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  26:</span>                 regKey.SetValue(<span style="color: #006080;">""</span>, System.Environment.GetFolderPath(</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  27:</span>                     Environment.SpecialFolder.System) + <span style="color: #006080;">@"\mscoree.dll"</span>);</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  28:</span>                 regKey.Close();</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  29:</span>             }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  30:</span>         }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  31:</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  32:</span> <span style="color: #008000;">// Unregisters COM class from the registry</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  33:</span>         [ComUnregisterFunction]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  34:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> UnregistrationMethod(Type type)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  35:</span>         {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  36:</span> <span style="color: #0000ff;">if</span> (<span style="col
or: #0000ff;">typeof</span>(JoelsUDFClass) == type)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  37:</span>                 Registry.ClassesRoot.DeleteSubKey(<span style="color: #006080;">"CLSID\\{"</span> +</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  38:</span>                     ClassID + <span style="color: #006080;">"}\\Programmable"</span>);</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  39:</span>         }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  40:</span> <span style="color: #cc6633;">#endregion</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  41:</span> <span style="color: #cc6633;">#region</span> UDF bits</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  42:</span> <span style="color: #008000;">/// &lt;summary&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  43:</span> <span style="color: #008000;">/// My very complex UDF method... </span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  44:</span> <span style="color: #008000;">/// &lt;/summary&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  45:</span> <span style="color: #008000;">/// &lt;param name="value"&gt;Some number.&lt;/param&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  46:</span> <span style="color: #008000;">/// &lt;returns&gt;Passed in value incremented by one.&lt;/returns&gt;</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  47:</span> <span style="color: #008000;">// Mark this method as an Excel Services UDF method</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  48:</span>         [UdfMethod]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  49:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> AddOne(<span style="color: #0000ff;">double</span> <span style="color: #0000ff;">value</span>)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  50:</span>         {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  51:</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">value</span> + 1;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  52:</span>         }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  53:</span> <span style="color: #cc6633;">#endregion</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  54:</span>     }</pre><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; pad ding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none;"><span style="color: #606060;">  55:</span> }</pre></div></div><p>I’d then need to register the assembly with RegAsm.exe (from the %SystemRoot%\Microsoft.NET\Framework\v2.xxxx folder).</p><pre>RegAsm.exe /codebase UDFExample.dll</pre><p><a
rel=\"nofollow\" rel=\"WLPP\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cHM6Ly9tYTJhYXcuYmx1LmxpdmVmaWxlc3RvcmUuY29tL3kxbVBIbDFpWTdrZnpVMHB1NzFlZEI2VHhIWjFNNnFLcWxDTk01eS1ZLUc3dWx6d1pPaVVHVTVEdkpQdHNwSG5tUktiandlZEt5S0U1bV91NFd4Wkw1dW1JZTBKV3FNNEg5c05sX3F5SEVJTGNDU2FOS1VZTVRXeG9sU2N6ejlCekEwYWZIc0NTRHc1cXMvaW1hZ2VbOV0ucG5n"><img
style="display: inline; border-width: 0px;" title="Click to zoom! Running RegAsm from the command prompt." src="http://cdn.joelblogs.com/wp-content/uploads/2010/08/image_thumb5.png" border="0" alt="Click to zoom! Running RegAsm from the command prompt." width="578" height="301" /></a></p><p>Finally I’d add it to Excel as a Excel Automation add-in. Under Excel Client 2007, this is available in File –&gt; Excel Options –&gt; Add-Ins, then select Manage: Excel Add-ins.</p><p><a
rel=\"nofollow\" rel=\"WLPP\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cHM6Ly9tYTJhYXcuYmx1LmxpdmVmaWxlc3RvcmUuY29tL3kxbTF2S2NJOExjdDFPaXJ2cm5acmM4eDJBaHhwaFFwa2pHTWM5c0w3c01RdnlONXRPZ0FiSUMxMlFsNmpud1lRLXgteW5NZVpWY3VNUXZZdXdlQmhCZVdfMVVmc0xFdXRWNVEzcjNGVE1BbnFzWG1pVk5hR2hEWGdCMzBjbUZLc0Z1dk51bzFUdG52UWMvaW1hZ2VbMThdLnBuZw=="><img
style="display: inline; border-width: 0px;" title="Click to zoom! Managing Excel Add-ins in Excel 2007." src="http://cdn.joelblogs.com/wp-content/uploads/2010/08/image_thumb8.png" border="0" alt="Click to zoom! Managing Excel Add-ins in Excel 2007." width="193" height="244" /></a></p><p>Next, select Automation and find your registered Add-in class.</p><p><a
rel=\"nofollow\" rel=\"WLPP\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cHM6Ly9tYTJhYXcuYmx1LmxpdmVmaWxlc3RvcmUuY29tL3kxbUFIczZHV3o1RTdJcjRaSVAwNEFmRkNYYS1xemh5RENIVnBvVnBjRzNEWDE3RGJnUzBCU1EtcXRyYXpLYXMxcHBJTW4zTnpVRGdNRjZpblBlR1ZFNzJnMkxMY29lblhJOVRKWnJjdzFvYWxjMjFFZTF5LUtNcFlTNndhcjV6N0JwQnA4c3ZFbDd5TFkvaW1hZ2VbMTVdLnBuZw=="><img
style="display: inline; border-width: 0px;" title="Click to zoom! Automation Add-Ins in Excel 2007." src="http://cdn.joelblogs.com/wp-content/uploads/2010/08/image_thumb7.png" border="0" alt="Click to zoom! Automation Add-Ins in Excel 2007." width="244" height="214" /></a></p><p>This *can* cause Excel to complain with the following error:</p><p><a
rel=\"nofollow\" rel=\"WLPP\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cHM6Ly9tYTJhYXcuYmx1LmxpdmVmaWxlc3RvcmUuY29tL3kxbWZhQmJMOGhMZ0dlUS05dmZzaUVfbmlBeTdNLTh3eXpWZ2JnemNkSFBFekhoamVBNkU4YVc3REphMHB3OU9HdHoxOUZLYkNGMEh6SWRUM0FhY2pjcS00aHRFNjFRekVyOGtPX1BaeVo5QVMxMGctV3kwSFYwaGdFN0RRMGNxX3ZGZTcxX0F2eGZuVlkvaW1hZ2VbMjFdLnBuZw=="><img
style="display: inline; border-width: 0px;" title="Click to zoom! Cannot find add-in 'mscoree.dll'. Delete from list?" src="http://cdn.joelblogs.com/wp-content/uploads/2010/08/image_thumb9.png" border="0" alt="Click to zoom! Cannot find add-in 'mscoree.dll'. Delete from list?" width="244" height="106" /></a></p><p>It’s important that you say “no” to this.</p><p>Then you can start using your UDFs in Excel as if they were built in functions.</p><p><a
rel=\"nofollow\" rel=\"WLPP\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cHM6Ly9tYTJhYXcuYmx1LmxpdmVmaWxlc3RvcmUuY29tL3kxbXRVdV92b0NHTjRwV0p3THlpSUd2MlR0UldrT2lZbW5yVFFHWXdBVGh2bi03M0xscGdBemx6QmE4bFdoMUY2ZHdkTmlaUzdmYkNGVGxpTGtPUGttckJfdFFZRWkzMHA1N1BvaEdnTlVUR2dsa3dTU3k5WDlKRnoxZk1kUUhISnZiZm1DSnZKVm5HaXcvaW1hZ2VbMjRdLnBuZw=="><img
style="display: inline; border-width: 0px;" title="Click to zoom! Using my Excel Services UDF in Excel Client 2007." src="http://cdn.joelblogs.com/wp-content/uploads/2010/08/image_thumb10.png" border="0" alt="Click to zoom! Using my Excel Services UDF in Excel Client 2007." width="218" height="244" /></a></p><p>If you’d like the Visual Studio 2008 solution for this example, you can download it here:</p> <img
src="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=9986" width="1" height="1" style="display: none;" /><p
class='technorati-tags'>Technorati Tags: <a
class='technorati-link' href='http://technorati.com/tag/Excel' rel='tag,nofollow' target='_blank'>Excel</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Add-ins' rel='tag,nofollow' target='_blank'>Excel Add-ins</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Services' rel='tag,nofollow' target='_blank'>Excel Services</a>, <a
class='technorati-link' href='http://technorati.com/tag/MOSS+2007' rel='tag,nofollow' target='_blank'>MOSS 2007</a>, <a
class='technorati-link' href='http://technorati.com/tag/Office+Server' rel='tag,nofollow' target='_blank'>Office Server</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint' rel='tag,nofollow' target='_blank'>SharePoint</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint+Architecture' rel='tag,nofollow' target='_blank'>SharePoint Architecture</a>, <a
class='technorati-link' href='http://technorati.com/tag/UDF' rel='tag,nofollow' target='_blank'>UDF</a>, <a
class='technorati-link' href='http://technorati.com/tag/User+Defined+Functions' rel='tag,nofollow' target='_blank'>User Defined Functions</a></p>]]></content:encoded> <wfw:commentRss>http://joelblogs.co.uk/2009/03/18/wss-3-0-and-moss-2007-tips-5-popular-misconceptions-%e2%80%93-excel-services-udfs-and-excel-client-2007/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>WSS 3.0 and MOSS 2007 tips #1 &#8211; Popular Misconceptions – Excel Services</title><link>http://joelblogs.co.uk/2008/10/11/wss-3-0-and-moss-2007-tips-1-popular-misconceptions-%e2%80%93-excel-services/</link> <comments>http://joelblogs.co.uk/2008/10/11/wss-3-0-and-moss-2007-tips-1-popular-misconceptions-%e2%80%93-excel-services/#comments</comments> <pubDate>Sat, 11 Oct 2008 15:38:00 +0000</pubDate> <dc:creator>Joel Jeffery</dc:creator> <category><![CDATA[SharePoint]]></category> <category><![CDATA[Excel Services]]></category> <category><![CDATA[Excel Web Access]]></category> <category><![CDATA[MOSS]]></category> <category><![CDATA[UDF]]></category> <category><![CDATA[User Defined Function]]></category> <category><![CDATA[WSS]]></category><guid
isPermaLink="false">http://joelj.co.uk/?p=9978</guid> <description><![CDATA[<p>I don’t know if there’s enough of these to make a series, but I’m going to give it a go.</p><p>I’m going to start with a MOSS Excel Services tip. If you’re already using this in anger, then I’m preaching to the converted. If you’re considering using <a
rel=\"nofollow\" title=\"Introduction to Excel Services and Excel Web Access\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL29mZmljZS5taWNyb3NvZnQuY29tL2VuLXVzL3NoYXJlcG9pbnRzZXJ2ZXIvSEExMDEwNTQ3NjEwMzMuYXNweA==">Excel Services</a>, or you’re about to advise a client on Excel Services, there’s a few things you need to know.</p><p>First off, some stuff you’ll probably know. Excel Services is a great platform for consolidating spreadsheets and bringing order for clients that are heavy Excel users. Investment banks – we know who you are – you folks with tens or hundreds of thousands of complex spreadsheets that get emailed about between users. Some of these spreadsheets are used to make multi-billion dollar decisions for the larger banks. Often, the authors of these spreadsheets are long since departed. Frequently, the banks daren’t make material changes to the business logic therein, just in case it all goes a bit <em><a
rel=\"nofollow\" title=\"Pete Tong on Wikipedia\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXRlX1Rvbmc=">Pete Tong</a></em>.</p><p><a
href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2pvZWxibG9ncy5jby51ay8yMDA4LzEwLzExL3dzcy0zLTAtYW5kLW1vc3MtMjAwNy10aXBzLTEtcG9wdWxhci1taXNjb25jZXB0aW9ucy0lZTIlODAlOTMtZXhjZWwtc2VydmljZXMv" class=\"more-link\">Read more on WSS 3.0 and MOSS 2007 tips #1 &#8211; Popular Misconceptions – Excel Services&#8230;</a></p> <img
src="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&#038;post_id=9978" width="1" height="1" style="display: none;" /><p
class='technorati-tags'>Technorati Tags: <a
class='technorati-link' href='http://technorati.com/tag/Excel+Services' rel='tag,nofollow' target='_blank'>Excel Services</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Web+Access' rel='tag,nofollow' target='_blank'>Excel Web Access</a>, <a
class='technorati-link' href='http://technorati.com/tag/MOSS' rel='tag,nofollow' target='_blank'>MOSS</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint' rel='tag,nofollow' target='_blank'>SharePoint</a>, <a
class='technorati-link' href='http://technorati.com/tag/UDF' rel='tag,nofollow' target='_blank'>UDF</a>, <a
class='technorati-link' href='http://technorati.com/tag/User+Defined+Function' rel='tag,nofollow' target='_blank'>User Defined Function</a>, <a
class='technorati-link' href='http://technorati.com/tag/WSS' rel='tag,nofollow' target='_blank'>WSS</a></p>]]></description> <content:encoded><![CDATA[<p>I don’t know if there’s enough of these to make a series, but I’m going to give it a go.</p><p>I’m going to start with a MOSS Excel Services tip. If you’re already using this in anger, then I’m preaching to the converted. If you’re considering using <a
rel=\"nofollow\" title=\"Introduction to Excel Services and Excel Web Access\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL29mZmljZS5taWNyb3NvZnQuY29tL2VuLXVzL3NoYXJlcG9pbnRzZXJ2ZXIvSEExMDEwNTQ3NjEwMzMuYXNweA==">Excel Services</a>, or you’re about to advise a client on Excel Services, there’s a few things you need to know.</p><p>First off, some stuff you’ll probably know. Excel Services is a great platform for consolidating spreadsheets and bringing order for clients that are heavy Excel users. Investment banks – we know who you are – you folks with tens or hundreds of thousands of complex spreadsheets that get emailed about between users. Some of these spreadsheets are used to make multi-billion dollar decisions for the larger banks. Often, the authors of these spreadsheets are long since departed. Frequently, the banks daren’t make material changes to the business logic therein, just in case it all goes a bit <em><a
rel=\"nofollow\" title=\"Pete Tong on Wikipedia\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXRlX1Rvbmc=">Pete Tong</a></em>.</p><p>Similar stories exist even when there aren’t decisions being made with quite such a high dollar-value. Government departments, pharmaceutical companies, accountancy firms, consultancies – the list goes on. All places with the potential to generate tonnes (<a
rel=\"nofollow\" title=\"Google search: how much does a gigabyte weigh?\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPWhvdyttdWNoK2RvZXMrYStnaWdhYnl0ZSt3ZWlnaA==">can I measure digital data by weight?</a>) of spreadsheets copied from user to user.</p><p>Microsoft Office SharePoint Server provides check-in and check-out to help restrict this kind of proliferation, as you’d expect in common with the rest of the Document Library features of MOSS. Excel Services gives us much more on top of that</p><p>When you add an Excel spreadsheet to a suitably configured Document Library, you can use Excel Web Access <em>– kind of like Outlook Web Access -</em> to view and interact with it. In fact, viewing through Excel Web Access is the default action on Excel spreadsheets in such a Document Library. There is also programmatic and web service access to Excel Services, which I’ll try and come to in another blogging.</p><p>Which brings us to:</p><p><strong>Popular Misconception #1</strong> – “You can edit the spreadsheet through the browser. The spreadsheet experience is just like the real thing – just like <a
rel=\"nofollow\" title=\"Google Docs  - and spreadsheets!\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2RvY3MuZ29vZ2xlLmNvbQ==">Google Docs</a>.”</p><p>Nope. No you can’t. No it’s not. Sorry.</p><p>It’s good though! And what it offers is valuable. Instead, you get 60-70% of the core Excel desktop experience through the browser. Graphs, colour bars, pivot tables. All good, all decently rendered. And you can interact with the sheet through settable parameters and filters.</p><p>You can’t edit the sheet and you can’t save it. If you want to do that, you can either open the sheet in Excel client on the desktop, or create a “snapshot” – once again, for use in Excel client.</p><p>Why is this good? If you expose the sheet <strong>*solely*</strong> through Excel Web Access, none of your hard earned intellectual property<em> – none of your business logic –</em> ends up in the hands of your audience. You can build dashboards in MOSS that show regions of multiple spreadsheets or charts side-by-side with Key Performance Indicators (KPIs) or any other information you want to display.</p><p><strong>Popular Misconception #2 </strong>– “I can take one of our complex spreadsheets and just stick it in Excel Services and have it run server side.”</p><p>Nope. Sorry. You&#8217;ve more than likely got some work to do. If your spreadsheet uses:</p><ul><li>VBA macros</li><li>COM add-ins</li><li>User Defined Functions</li></ul><p>…you have some difficult decisions ahead of you.</p><p>If a lot of your business logic resides in VBA macros, you’ll need to consider recoding these as an Excel Services User Defined Function (UDF) in a .NET language. If your spreadsheet does lots of gnarly Monte Carlo analysis using a visual COM add-in, once again you’re left with a significant coding exercise.</p><p>If you’re lucky enough that your spreadsheet already uses client-side, C language User Defined Functions, you can either, once again, re-code them as an Excel Services Managed UDF – or write a managed wrapper for them.</p><p>There is a good list of unsupported and partially supported Excel client features in Excel Services <a
rel=\"nofollow\" title=\"Supported Features in Excel Services\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2Jsb2dzLm1zZG4uY29tL2V4Y2VsL2FyY2hpdmUvMjAwNS8xMi8wMS80OTkyMDYuYXNweA==">here</a>.</p><p>So, how do you do it? It can’t be easy, surely?</p><p><strong>Popular Misconception #3</strong> – “SharePoint Excel Services UDFs are difficult. It’s better just stick to simple spreadsheets and keep the complex ones as desktop spreadsheets.”</p><p>Very, very easy.</p><p>First, create a .NET 2.0/3.5 managed Class Library project in Visual Studio 2005/8.</p><p>Second, make a reference to <strong>Microsoft.Office.Excel.Server.UDF.dll, </strong>which is usually sitting here: C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI on a server with MOSS installed.</p><p>Third, we’ll write our class and methods. Here’s a C# example.</p><div
style="font-size: 8pt; margin: 20px 0px 10px; overflow: auto; width: 97.5%; cursor: text; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border: gray 1px solid; padding: 4px;"><div
style="font-size: 8pt; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   1:</span> <span style="color: #0000ff;">using</span> System;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   2:</span> <span style="color: #0000ff;">using</span> Microsoft.Office.Excel.Server.Udf;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   3:</span></pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   4:</span> [UdfClass]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; b order-left-style: none; background-color: white; border-bottom-style: none; padding: 0px;"><span style="color: #606060;">   5:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> MyUDFClass</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   6:</span> {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   7:</span>     [Udfmethod]</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">   8:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> MyUDFMethod(<span style="color: #0000ff;">double</span> x, <span style="color: #0000ff;">double</span> y)</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">   9:</span>     {</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  10:</span> <span style="color: #0000ff;">return</span> x * y + y;</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px;"><span style="color: #606060;">  11:</span>     }</pre><pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px;"><span style="color: #606060;">  12:</span> }</pre></div></div><div>We tell the UDF framework that our class contains UDFs by decorating it with the UdfClass attribute &#8211; in line 4. Similarly, you mark up one or more methods as being a UDF by decorating then with the UdfMethod attribute – in line 7. You can read an in depth tutorial on msdn.com <a
rel=\"nofollow\" title=\"http://msdn.microsoft.com/en-us/library/bb428649.aspx\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2JiNDI4NjQ5LmFzcHg=">here</a>.</div><p>That’s more or less it. You’re now at liberty to fill your class and methods with as complex business logic as you see fit. The final step is configuration of the Shared Service Provider (SSP) for Excel Services, and deployment to a MOSS server &#8211; which may well be the topic of a future blogging.</p><p>To use your new UDF in a spreadsheet couldn’t be easier. You don’t even need to deploy the UDF to the desktop machine you’ll use to create the spreadsheet. Simply open a new spreadsheet, and use your function in a formula as if it meant something to Excel, thus:</p><p><a
rel=\"nofollow\" href="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2JsdWZpbGVzLnN0b3JhZ2UubXNuLmNvbS95MXBLaDF0M1lzOWlfVkxmemlFcFZ2QW5UUElOdlVrcjdGS1Z3LXJzVW56Yzd1VHRGb2dOMUNNdW5JMERBYXEzbFRNeEhORXFyZGhLZ0E/UEFSVE5FUj1XUklURVI="><img
style="display: inline; border: 0px;" title="Using a Managed UDF in Excel Client" src="http://blufiles.storage.msn.com/y1p0V8eUx-lCoor05f2uKdTyy_ZAHCuO3qOPOSrEpmtpwMdndRbhx7fDQ_Mj8fGz5oYehFZf1mxLlU?PARTNER=WRITER" border="0" alt="Using a Managed UDF in Excel Client" width="451" height="313" /></a><br
/> <strong>Figure 1 &#8211; Using a Managed UDF in Excel Client</strong></p><p>Yes, when you hit return it will get resolved to <strong>“#NAME?” </strong>as if it doesn’t recognise it. This is, of course, because it really doesn’t recognise it, and it won’t be recognised until you deploy that spreadsheet to a correctly configured Document Library.</p><p><strong>That’s it for this time! :)</strong></p><p>If you’ve been evangelising Excel Services having never used it, I hope this has cleared up a couple of common misconceptions. If you’ve been tempted to, but never quite made the jump, I hope this has given you a push to just <strong>*try*</strong> Excel Services. They’re pretty cool and, as I hope you’ll see, offer a compelling business story for bringing Excel spreadsheets back under control.</p> <img
src="http://joelblogs.co.uk/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=9978" width="1" height="1" style="display: none;" /><p
class='technorati-tags'>Technorati Tags: <a
class='technorati-link' href='http://technorati.com/tag/Excel+Services' rel='tag,nofollow' target='_blank'>Excel Services</a>, <a
class='technorati-link' href='http://technorati.com/tag/Excel+Web+Access' rel='tag,nofollow' target='_blank'>Excel Web Access</a>, <a
class='technorati-link' href='http://technorati.com/tag/MOSS' rel='tag,nofollow' target='_blank'>MOSS</a>, <a
class='technorati-link' href='http://technorati.com/tag/SharePoint' rel='tag,nofollow' target='_blank'>SharePoint</a>, <a
class='technorati-link' href='http://technorati.com/tag/UDF' rel='tag,nofollow' target='_blank'>UDF</a>, <a
class='technorati-link' href='http://technorati.com/tag/User+Defined+Function' rel='tag,nofollow' target='_blank'>User Defined Function</a>, <a
class='technorati-link' href='http://technorati.com/tag/WSS' rel='tag,nofollow' target='_blank'>WSS</a></p>]]></content:encoded> <wfw:commentRss>http://joelblogs.co.uk/2008/10/11/wss-3-0-and-moss-2007-tips-1-popular-misconceptions-%e2%80%93-excel-services/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Served from: joelblogs.co.uk @ 2012-05-18 15:27:31 by W3 Total Cache -->
