Willy laroche

B10g $ur 13$ t3chn0$ M!cr0$0ft 3t p1u$ $! 4ff!n!té$…

C# Manipuler Office avec COM Interop

3 Commentaires

Suite à plusieurs questions sur le sujet, je me permets d’écrire ce petit bout de code qui servira à ouvrir un fichier Excel (ou autre documents office) avec COM Interop.

Pour info, j’utilise la version 14.0.0.0 de l’assembly : Microsoft.Office.Interop.Excel

C# 4 (.NET 4)

D’après ce que j’ai entendu, il y a des problèmes de compatibilité sur l’utilisation d’Interop avec la version Office 64 bits, prévilégiez donc la version 32bits.

Il vous faudra aussi manipuler ces objets sous la culture « en-US » si vous êtes sur une Culture autre que celle-ci.

Dans mon cas je suis sous la culture « fr-FR ».

Petit exemple :

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

Application _excelApp = new Application();
object opt = Type.Missing;

Workbook workBook = null;
Worksheet sheet = null;

try
{
    workBook = _excelApp.Workbooks.Open(thisFileName, opt, opt, opt, opt, opt,
               opt, opt, opt, opt, opt, opt, opt, opt, opt);

    //your process...
}
catch (Exception ex)
{
    throw new Exception(ex.Message);
}
finally
{
    if (workBook != null)
        workBook.Close(opt, opt, opt);

    if (_excelApp != null)
        _excelApp.Quit();

    // Clean unmanaged objects
    if (_excelApp != nullMarshal.FinalReleaseComObject(_excelApp);
    if (workBook != nullMarshal.FinalReleaseComObject(workBook);
    if (sheet != nullMarshal.FinalReleaseComObject(sheet);

    _excelApp = null;
    workBook = null;
    sheet = null;

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    Thread.CurrentThread.CurrentCulture = currentCulture;
}

Voilà, le fichier Office Excel est correctement libéré.

3 réflexions sur “C# Manipuler Office avec COM Interop

  1. J’ai deux AddIn Vsto en VB, un pour excel, un pour Powerpoint, et l’un execute du code de l’autre en passant par le COM Interop => http://blogs.msdn.com/b/andreww/archive/2007/01/15/vsto-add-ins-comaddins-and-requestcomaddinautomationservice.aspx . Un plantage survient en release uniquement une fois déployé et non au debug. Votre post m’a ouvert une piste qui consiste à ne pas changer la langue d’excel pendant un appel COM. Est ce que vous pouvez préciser les sources de  » D’après ce que j’ai entendu (…)  » ?

  2. Bonjour,
    Le plus simple est de tout gérer dans la même culture (en anglais par exemple).
    L’utilisation de COM nécessite quand même de bien cadrer son code avec des try catch.
    Et en attanchant le process en release, pouvez vous voir quelle erreur est remontée ?

  3. Bonjour ,
    je suis en train de développer un Addins pour Outlook 2010 sous VS
    2010, l’une des fonctionnalité de mon complément est la possibilité
    d’exporter les données finales en Excel.

    Mais pour des raison données il me faut une colonne de checkbox dans
    une colonne donnée ; et voici mon code actuel:

    [Le code]

    ExcelTools.Controls.CheckBox checkBox1 = excelApp.ThisWorkbook.ActiveSheet.Controls.AddCheckBox(workSheet.Range[« F2 »,Type.Missing], « checkBox1 »);

    [l’Erreur]

    HRESULT : 0x800AC472

    Quelqu’un a t’il une idée ? Merci.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s