How to add a picture to a worksheet in Word and Excel using VSTO with c# and autosize

Here is a really simple example of adding a picture without really needing to know the dimensions of the image. Excel uses points which is pretty annoying, since pics are in pixels….duh… I put in the sizes for my pics, but you could use any number since we repair it with the scale calls. Anyway, here it is. Word vstoDoc is my document.

[csharp]
//push resource to disk.
var path = Path.GetDirectoryName(vstoDoc.FullName);
var fn = Path.Combine(path,"rfn.png");
//insert the fun fact box at top.
var pic = vstoDoc.Shapes.AddPicture(fn,false,true,5,5,455/1.0,162/1.0);
pic.Name = ROLLFORWARDSHAPENAME;
pic.ScaleHeight(1, MsoTriState.msoTrue);
pic.ScaleWidth(1, MsoTriState.msoTrue);
[/csharp]

Here is Excel. vstoSheet is my Worksheet. I loop through them to add pics.

[csharp]
//push resource to disk.
var path = Path.GetDirectoryName(vstoDoc.FullName);
var fn = Path.Combine(path,"rfn.png");
var pic = vstoSheet.Shapes.AddPicture(fn, MsoTriState.msoFalse, MsoTriState.msoTrue, 5, 5, 231 * 72 / 96, 317 * 72 / 96);
pic.Name = ROLLFORWARDSHAPENAME;
pic.Locked = false;
pic.ScaleHeight(1, MsoTriState.msoTrue);
pic.ScaleWidth(1, MsoTriState.msoTrue);
[/csharp]

Happy Coding!

How to speed up Excel and Word 2003,2007 and 2010 launch times when using Automation in C#

One of the biggest impacts on the launch time for Office is the speed at which all of the addins load. Unfortunately, poorly written or unnecessary addins add a startup cost which isn’t something you want to have to pay when loading Office via automation.
I wrote a nice helper class that allows you save the pain of loading them, without impacting the users experience.
Here is the class:

[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Win32;
 
namespace Seekford.Office
{
    public class OfficeAddinManagementUtility : IDisposable
    {
        private Dictionary<string, int > wordLoadBehaviorStorage = new Dictionary<string, int >();
        private Dictionary<string ,int > excelLoadBehaviorStorage = new Dictionary<string, int >();
 
        private const string _wordAddinRootKey = @"SoftwareMicrosoftOfficeWordAddins";
        private const string _excelAddinRootKey = @"SoftwareMicrosoftOfficeExcelAddins";
        private const string _loadString = "LoadBehavior";
 
        public void DisableAllWordAddins()
        {
            if (wordLoadBehaviorStorage.Any()) return;//unbalanced?
            DisableAllAddinsInHive(_wordAddinRootKey, wordLoadBehaviorStorage);
        }
 
        public void DisableAllExcelAddins()
        {
            if (excelLoadBehaviorStorage.Any()) return;//unbalanced?
            DisableAllAddinsInHive(_excelAddinRootKey, excelLoadBehaviorStorage);
        }
 
 
        private void DisableAllAddinsInHive(string hiveLocation, Dictionary<string, int > storage)
        {
            var userKey = Registry.CurrentUser.OpenSubKey(hiveLocation);
            if (userKey != null)
            {
                var subKeys = userKey.GetSubKeyNames();
                if (subKeys != null)
                {
                    foreach (var s in subKeys)
                    {
                        var subKey = userKey.OpenSubKey(s, true);
                        int val = (int)subKey.GetValue(_loadString, 0);
                        if (val != 0)
                        {
                            subKey.SetValue(_loadString, 0);
                            storage.Add(s, val);
                        }
                    }
                }
            }
        }
 
        private void RevertAllAddinsInHive(string hiveLocation, Dictionary<string, int > storage)
        {
            var userKey = Registry.CurrentUser.OpenSubKey(hiveLocation);
            if (userKey != null)
            {
                var subKeys = userKey.GetSubKeyNames();
                if (subKeys != null)
                {
                    foreach (var s in subKeys)
                    {
                        if (storage.ContainsKey(s))
                        {
                            var subKey = userKey.OpenSubKey(s, true);
                            if(subKey != null)
                            {
                                subKey.SetValue(_loadString, storage[s]);
                                storage.Remove(s);
                            }
                        }
                    }
                }
            }
        }
 
        public void RevertAllAddins()
        {
            RevertWordAddin();
            RevertExcelAddin();
        }
 
        public void RevertWordAddin()
        {
            if(wordLoadBehaviorStorage.Any())
                RevertAllAddinsInHive(_wordAddinRootKey, wordLoadBehaviorStorage);
        }
 
        public void RevertExcelAddin()
        {
            if(excelLoadBehaviorStorage.Any())
                RevertAllAddinsInHive(_excelAddinRootKey, excelLoadBehaviorStorage);
        }
       
        public void Dispose()
        {
            RevertAllAddins();
        }
    }
} 
[/csharp]

See how easy that is.

Just wrap your Word or Excel code, call the right methods and away you go.

[csharp]
//code below is a snippet showing you to disable addins, create your automated word,
// then reenable the addins for future word users
// use the excel methods for excel addins.
               var addinManager = new OfficeAddinManagementUtility();
                try
                {
                        addinManager.DisableAllWordAddins();
			myWord = new Word();
                }
                finally
                {
                    addinManager.RevertWordAddin();
                    addinManager.Dispose();//same as above, but lets comply with regs
                }
                return myWord;
[/csharp]

The utility disables all the Office Addins and then enables them back for the next launch of Office.

It is an easy to use C# class for disabling Word 2007/2010 and Excel 2007/2010 Addins. Should work with 2003 as well.

Happy Coding!

KillExcel – A simple way to purge those unwanted ghost processes

If you develop Office Addins, or automate office, you probably have the issue of dealing with a lot of ghost Excel processes. You get them when you don’t free properly, or you kill your process but the Excel doesn’t get terminated(which is almost certain when you abnormally terminate).

Anyway, this simple executable will iterate all your Excel processes and kill them.

Note: Built in 4.0 .NET framework.

KillExcel.exe

Happy Coding!