web-dev-qa-db-fra.com

Comment utiliser Microsoft.Office.Interop.Excel sur une machine sur laquelle MS Office n'est pas installé?

J'écris une application qui fonctionne avec les fichiers Excel .J'ai besoin d'une fonctionnalité pour supprimer une feuille . Je dois utiliser un Assembly Microsoft.Office.Interop.Excel.dll.

Il fonctionne bien sur la machine du développeur, mais lorsque j'essaie de le déployer sur le serveur, un message d'erreur s'affiche:

Impossible de charger le fichier ou le bureau de l'Assemblée, version = 14.0.0.0, Culture = neutre, PublicKeyToken = 71e9bce111e9429c 'ou l'un de ses les dépendances

Je comprends que ce problème se produit lorsque MS Office n’est pas installé sur une machine . Le client ne souhaite pas installer et acheter MS Office sur un serveur à n’importe quel prix.

J'installe "Assemblages d'interopérabilité primaires primaires redistribuables" sur la machine à développer, comme indiqué ici: http://forums.asp.net/t/1530230.aspx/1

Exemple de code:

public bool DeleteSheet(string tableName)
{
    Excel.Application app = null;
    Excel.Workbooks wbks = null;
    Excel._Workbook _wbk = null;
    Excel.Sheets shs = null;

    bool found = false;

    try
    {
        app = new Excel.Application();
        app.Visible = false;
        app.DisplayAlerts = false;
        app.AlertBeforeOverwriting = false;

        wbks = app.Workbooks;
        _wbk = wbks.Add(xlsfile);
        shs = _wbk.Sheets;
        int nSheets = shs.Count;

        for (int i = 1; i <= nSheets; i++)
        {
            Excel._Worksheet _iSheet = (Excel._Worksheet)shs.get_Item(i);
            if (_iSheet.Name == tableName)
            {
                _iSheet.Delete();
                found = true;

                Marshal.ReleaseComObject(_iSheet);
                break;
            }
            Marshal.ReleaseComObject(_iSheet);
        }

        if (!found)
            throw new Exception(string.Format("Table \"{0}\" was't found", tableName));

        _wbk.SaveAs(connect, _wbk.FileFormat, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    }
    finally
    {
        _wbk.Close(null, null, null);
        wbks.Close();
        app.Quit();

        Marshal.ReleaseComObject(shs);
        Marshal.ReleaseComObject(_wbk);
        Marshal.ReleaseComObject(wbks);
        Marshal.ReleaseComObject(app);
    }
    return true;
}

Une exception

Récupération de la fabrique de classes COM pour le composant avec CLSID {00024500-0000-0000-C000-000000000046} a échoué pour les raisons suivantes erreur: 80040154 Classe non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

se produit sur la ligne 

app = new Excel.Application();

Quelqu'un peut-il conseiller sur la manière de faire fonctionner cette fonctionnalité avec succès?

63
John Wales

Vous ne pouvez pas utiliser Microsoft.Office.Interop.Excel sans avoir installé MS Office. 

Il suffit de chercher dans Google pour certaines bibliothèques, ce qui permet de modifier xls ou xlsx:

58
user1519979

Si le "client ne veut pas installer et acheter MS Office sur un serveur, pas à n'importe quel prix", vous ne pouvez pas utiliser Excel ... Mais je ne peux pas comprendre, il s'agit d'une licence Office de base qui coûte environ 150 USD ... Et je suppose que passer du temps à trouver une alternative coûtera bien plus que ce montant!

2
Philippe Grondier

vous pouvez créer un service et générer Excel sur le serveur, puis autoriser les clients à télécharger Excel . cos achetant une licence Excel pour 1000 ppl, il est préférable d’avoir une licence par serveur.

j'espère que cela pourra aider.

2
Ashish

Recherchez GSpread.NET . Vous pouvez utiliser Google Spreadsheets à l'aide de l'API de Microsoft Excel . Vous n'avez pas besoin de réécrire l'ancien code avec la nouvelle utilisation de l'API Google. Ajoutez juste quelques lignes:

Set objExcel = CreateObject("GSpreadCOM.Application");

app.MailLogon(Name, ClientIdAndSecret, ScriptId);

C'est un projet OpenSource et il ne nécessite pas l'installation d'Office.

La documentation disponible ici http://scand.com/products/gspread/index.html

0
miro