U2U Blog Center

For developers and other creative minds

Welcome at the U2U Blog Center

U2U has built up the last 18 years a huge amount of expertise in the Microsoft .NET Framework. Expertise they have always shared in the community. Below you can find a list of the blogs maintained by U2U trainers.

Announcing the SharePoint Add-in “Export to Word”

Today, we’re glad to announce the FREE SharePoint Add-in “Export to Word”, developed by the team at U2U. This add-in fixes one of those issues that you’ll probably will have come across with in SharePoint, namely generating Word documents based on SharePoint list items. A bit like a mail merge for list items! This functionality has never been out of the box available for regular SharePoint list items. You could achieve something like it on document libraries only, using Quick Parts in Word. But however, that only works for document libraries. Now, what does the add-in allow you to do? It allows you to configure, per SharePoint list, one or more Word templates. You can even upload your own templates! The add-in then allows you to link fields from your selected list to the content of the template. Once your template is completely designed, you can just go to the SharePoint list and export any item to Word using your template. You can even export multiple items in bulk!    Do you want to know more about this add-in? Just go to the official site.Do you want to install it from the Office Store? You can find the add-in here. For a quick start guide on how to work with the add-in, have a look at the following video:   Do note that this is the first version of the Add-in, and we want your feedback to further extend and improve the add-in. You can contact us via the regular ways.

An Office 365 App for Site Collection Provisioning in SharePoint Online

Continuing on my previous post, I decided to create a new Office 365 app that would be able to manage site collections in SharePoint Online. When deciding to build an app that does site collection provisioning, you could chose to do this as a SharePoint App, but SharePoint Apps are typically contextual to the web they're hosted in. With the introduction of Office 365 Apps, which are contextual to the Office 365 tenant, provisioning site collections from an app seems more to be a task for an Office 365 App. My new application should be capable of: Getting an overview of available site collections Creating a new site collection Delete an existing site collection My previous post proved that you can access the SharePoint Online sites by means of the Client Side Object Model (CSOM). My goal now is to prove that you can also do SharePoint online administration tasks from an Office 365 app, using also CSOM. If you’re interested in the full source code, you can get it from GitHub. There you’ll also find how you can register the app in Azure Active Directory. Accessing SharePoint Online Administration As an extension to the SharePoint Client Side Object Model, you have the “Microsoft.Online.SharePoint.Client.Tenant.dll” library which gives you access to SharePoint Online Administration tasks. I.e. creating/deleting site collections, managing deleted site collections, … . Now, would it then be possible to use the Azure application registration and authentication to i.e. manage site collections? Yes, it is possible!In my previous post, I mentioned how you obtain the access token from Azure Active Directory. You can then get an accessToken for SharePoint Online administration as follows: string clientID = ConfigurationManager.AppSettings["ida:ClientId"] ?? ConfigurationManager.AppSettings["ida:ClientID"]; string appKey = ConfigurationManager.AppSettings["ida:AppKey"] ?? ConfigurationManager.AppSettings["ida:Password"]; string spSiteUrl = "https://tenant-admin.sharepoint.com"; string accessToken = await GetAccessToken(clientID, appKey, spSiteUrl) Take care that you replace tenant by your tenant name. Now that you have the accesToken, you can create the ClientContext as follows: ClientContext clientContext = new ClientContext("https://tenant-admin.sharepoint.com"); clientContext.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.WebRequest.Headers["Authorization"] = "Bearer " + accessToken; }; Getting an overview of all the site collections Now that you have the ClientContext, you can start using the Tenant class to get an overview of the available site collections. You can do this as follows: // Create tenant Tenant tenant = new Tenant(ctx); // Get the site properties SPOSitePropertiesEnumerable allSiteProperties = tenant.GetSiteProperties(0, true); // Load ctx.Load(allSiteProperties); await ctx.ExecuteQueryAsync(); The GetSiteProperties method currently only returns a maximum of 300 site collections. If you would like to get the next 300, increment the startIndex parameter to 300. Creating a new site collection In order to create a new site collection, you need to know the code of the webtemplate that should be applied to the new site collection. Now if you know the template code by hart, you can just pass it as a string, but better is to first check the available templates in SharePoint Online and chose the one you want to use. Because you have a ClientContext to your SharePoint Online Administration, you can check the web property for available web templates. You can do this as follows: // Get the webtemplates WebTemplateCollection webTemplates = ctx.Web.GetAvailableWebTemplates(lcid, false); // Load ctx.Load(webTemplates, templates => templates.Where(t => t.IsHidden == false)); // Execute await ctx.ExecuteQueryAsync(); The GetAvailableWebTemplates method takes in the language code lcid. Here also, if you know the language code that is available by hart, you can just pass it in here. Another approach would be to first check which languages are available in SharePoint Online: // Load ctx.Load(ctx.Web, w => w.SupportedUILanguageIds); // Execute query await ctx.ExecuteQueryAsync(); Now that we have the ClientContext, Language and template; you can create a new site collection. The Tenant class provides a method called CreateSite that accepts a SiteCreationProperties object as input and creates a new site collection using the properties supplied in the SiteCreationProperties instance. The snippet below illustrates how you can create a new site collection. In this snippet, you might observe that the CreateSite method returns an SpoOperation. Now, any operation that we can do on a site collection will return an SpoOperation. So when we create a new site collection, it will return an SpoOperation containing the information about the site collection creation operation. You can check the IsComplete property on the SpoOperation to check whether the operation has completed or not (reload the SpoOperation to check again), this is because the creation of a site collection happens asynchronously. // Create tenant Tenant tenant = new Tenant(ctx); // Create properties SiteCreationProperties siteCreationProperties = new SiteCreationProperties() { Url = "https://tenant.sharepoint.com/sites/createdbycode" , Title = "Site created by code" , Owner = "admin@tenant.onmicrosoft.com" , Template = "STS#0" , StorageMaximumLevel = 100 , UserCodeMaximumLevel = 50 }; // Create the sitecollection SpoOperation operation = tenant.CreateSite(siteCreationProperties); // Execute query ctx.ExecuteQuery(); Deleting an existing site collection In order to delete an existing site collection, the basic steps are again the same. The difference is the method that will be called from the Tenant class, being RemoveSite. Do note that the site collection is not permanently deleted, but is pushed to the recycle bin in which it can still be restored. Note that the RemoveSite also returns an SpoOperation. // Create tenant Tenant tenant = new Tenant(ctx); // Perform delete SpoOperation spoOperation = tenant.RemoveSite("https://tenant.sharepoint.com/sites/createdbycode"); // Load and execute ctx.Load(spoOperation); await ctx.ExecuteQueryAsync(); App screenshots Overview of sites: Creating a new site: