web-dev-qa-db-fra.com

Comment créer une instance d'Excel si Excel n'est pas installé

Dans mon application C #, avec l'aide de la DLL Excel Interop (comme référence), je lis/écris des fichiers Excel. Si je déplace ce programme vers un système où Office/Excel n'est pas installé (pensez à une machine propre), je frappe avec l'erreur ci-dessous.

System.Runtime.InteropServices.COMException (0x80040154): la récupération de la fabrique de classe COM pour le composant avec CLSID {00024500-0000-0000-C000-000000000046} a échoué en raison de l'erreur suivante: 80040154 classe non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG) )).

L'erreur ci-dessus est attendue car il n'y a pas d'Excel sur la machine cible.
Ma question est, existe-t-il une autre manière d'utiliser mon programme en dehors de l'enregistrement de la DLL Interop sur la machine cible?

19
Mahender

Ma question est, existe-t-il une autre manière d'utiliser mon programme en dehors de l'enregistrement de la DLL Interop sur la machine cible?

Vous demandez s'il existe un moyen d'utiliser votre programme, qui utilise l'interopérabilité Excel, lorsque Excel n'est pas installé sur l'ordinateur exécutant votre programme. La réponse courte est non. La réponse la plus longue est oui, si vous êtes prêt à refactoriser votre programme pour ne pas utiliser l'interopérabilité.

Vous pouvez utiliser le SDK OOXml fourni par Microsoft si la version d'Excel que vous ciblez est 2007 et plus. Vous pouvez également utiliser une bibliothèque tierce telle que Aspose si vous êtes prêt à dépenser un peu d'argent.

Un exemple d'utilisation du SDK OOXml pour insérer une feuille de calcul dans un fichier Excel se trouve dans Microsoft docs .

// Given a document name, inserts a new worksheet.
public static void InsertWorksheet(string docName)
{
    // Open the document for editing.
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
    {
        // Add a blank WorksheetPart.
        WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
        newWorksheetPart.Worksheet = new Worksheet(new SheetData());

        Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
        string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart);

        // Get a unique ID for the new worksheet.
        uint sheetId = 1;
        if (sheets.Elements<Sheet>().Count() > 0)
        {
            sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
        }

        // Give the new worksheet a name.
        string sheetName = "Sheet" + sheetId;

        // Append the new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
        sheets.Append(sheet);
    }
}
18
Seth Flowers

Même Microsoft ne recommande pas l'utilisation dans les bibliothèques Interop sur un serveur . Il est donc préférable de trouver un cadre alternatif pour faire Excel pour vous. J'ai utilisé avec succès Npoi dans le passé à cette fin.

Je sais que ce n'est pas une réponse à votre exception. Mais honnêtement, Interop est un chemin vers un problème sans fin et des messages d'exception cryptiques.

Mise à jour 2017 : Je n'ai pas utilisé NPOI depuis un moment maintenant et j'ai déplacé tous mes projets vers EPPlus insted - bibliothèque basée sur OpenXML qui vous crée des fichiers xlsx modernes.

15
trailmax

Vous pouvez enregistrer votre COM avec RegSrv32

Lien: http://msdn.Microsoft.com/en-us/library/ms859484.aspx

Vous êtes obligé d'enregistrer votre COM avant d'utiliser

0
Aghilas Yakoub

De toutes les recherches que j'ai faites il y a quelque temps, lorsque j'avais besoin d'interagir avec un fichier Excel sur un serveur, vous devez installer Office.

0
Gromer