Wie verwende ich Microsoft.Office.Interop.Excel auf einem Computer ohne installiertes MS Office?

74

Ich schreibe eine Anwendung, die mit Excel-Dateien funktioniert. Ich benötige eine Funktion, um ein Blatt zu löschen. Ich muss eine Assembly Microsoft.Office.Interop.Excel.dll verwenden.

Auf dem Entwicklercomputer läuft es einwandfrei, aber wenn ich versuche, es auf dem Server bereitzustellen, wird folgende Fehlermeldung angezeigt:

Datei oder Assembly 'Office, Version = 14.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c' oder eine ihrer Abhängigkeiten konnte nicht geladen werden

Ich verstehe, dass das Problem auftritt, wenn MS Office nicht auf einem Computer installiert ist. Der Kunde möchte MS Office nicht um jeden Preis auf einem Server installieren und kaufen.

Ich installiere "Redistributable Primary Interop Assemblies" auf dem Entwicklercomputer wie hier empfohlen: http://forums.asp.net/t/1530230.aspx/1 und kompiliere mein Projekt erneut.

Codebeispiel:

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;
}

Eine Ausnahme

Das Abrufen der COM-Klassenfactory für Komponenten mit der CLSID {00024500-0000-0000-C000-000000000046} ist aufgrund des folgenden Fehlers fehlgeschlagen: 80040154 Klasse nicht registriert (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

tritt in der Leitung auf

app = new Excel.Application();

Kann jemand raten, wie diese Funktion erfolgreich funktioniert?

John Wales
quelle
Nun, ich sehe, dass dies ein älterer Beitrag ist - also vielleicht zu spät -, aber ich musste dies in der Vergangenheit tun und habe Open XML-Formate verwendet: support.office.com/en-us/article/…
Jon Vote

Antworten:

65

Sie können Microsoft.Office.Interop.Excel nicht verwenden, ohne ms office installiert zu haben.

Suchen Sie einfach in Google nach einigen Bibliotheken, mit denen Sie xls oder xlsx ändern können:

user1519979
quelle
12
Ja, die Interop-Assemblys teilen .NET lediglich mit, wie die Excel-COM-Bibliotheken aufgerufen werden sollen. Sie haben keine Funktionalität. Ein weiteres beliebtes zum Lesen / Schreiben von XLSX-Dateien: Closedxml.codeplex.com
Govert
Vielen Dank. Ich werde diese Bibliotheken ausprobieren.
John Wales
3
Sie können nicht einmal ein Projekt erstellen , das Verweise auf Microsoft.Office.Core enthält, ohne auch Office zu installieren. Die anderen Interop-Assemblyreferenzen auf Dokumentebene scheinen kompiliert, aber nicht ausgeführt zu werden. Meine Problemumgehung bestand darin, die expliziten Microsoft.Office.Core- Referenzen zu löschen und durch dynamische und var- Schlüsselwörter zu ersetzen, die späte Referenzen ermöglichen, nachdem Intellisense seine Arbeit auf dem Computer des Entwicklers erledigt hat.
CZahrobsky
Ich habe Office installiert und bekomme das gleiche Problem. Können Sie bitte helfen?
ehh
1
XLSX SDK von Microsoft: docs.microsoft.com/en-us/office/open-xml/open-xml-sdk
Der_Meister
2

Wenn der "Kunde MS Office nicht um jeden Preis auf einem Server installieren und kaufen möchte", können Sie Excel nicht verwenden ... Aber ich kann den Trick nicht verstehen: Es geht um eine grundlegende Office-Lizenz, die ungefähr 150 kostet USD ... Und ich denke, dass die Suche nach einer Alternative weit mehr kostet als dieser Betrag!

Philippe Grondier
quelle
21
Die Verwendung von Excel auf einem Server ist Pad-Übung. Erstens: Es ist eine unnötige Verwundbarkeit. Zweitens ist es furchtbar langsam, das Schreiben und Lesen von Dokumenten dauert ewig - großartig, wenn Sie mehr als einen Benutzer haben ... Drittens: Office ist nicht für die vollständig automatisierte Verwendung vorgesehen. Es gibt Highcups, die Messageboxen usw. erstellen. Das ist auf Servern "nicht so gut" ...
Christian Sauer
"Zweitens ist es furchtbar langsam, das Schreiben und Lesen von Dokumenten dauert ewig" - Nach meiner Erfahrung nicht. Was ist auch, wenn Kunden Excel, MS Office vollständig oder eine andere Software über Thin Client nutzen möchten? Es wird hat in diesem Szenario auf einen Server gehen.
Alan B
20
Als Berater wäre es sehr peinlich, dem Kunden mitzuteilen, dass er MS Office auf seinen CI-Servern installieren müsste. Es geht nicht so sehr um das Geld, sondern um den Ärger und den WTF-Faktor. Und es könnte nicht nur ein Server sein, vielleicht haben sie 5,10,20 virtuelle CI-Server. Dann sprechen wir über mehr Geld und Verwaltungskosten als 150 Dollar.
Jonas Söderström
2
Ich stimme @ JonasSöderström zu, es geht nicht darum, eine Single-Office-Lizenz in Betracht zu ziehen
strike_noir
2

Sie können einen Dienst erstellen und Excel auf dem Server generieren und dann Clients das Herunterladen von Excel ermöglichen. Da Sie eine Excel-Lizenz für 1000 Personen kaufen, ist es besser, eine Lizenz für den Server zu haben.

hoffentlich hilft das.

Ashish
quelle
1
Die Entwicklung der Büroautomatisierung in der Client-Server-Architektur wird nicht empfohlen.
kaushalparik27
0

Suchen Sie nach GSpread.NET. Sie können mit Google Spreadsheets mithilfe der API von Microsoft Excel arbeiten. Sie müssen alten Code nicht mit der neuen Google API-Verwendung neu schreiben. Fügen Sie einfach ein paar Zeilen hinzu:

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

app.MailLogon(Name, ClientIdAndSecret, ScriptId);

Es ist ein OpenSource-Projekt und erfordert keine Installation von Office.

Die Dokumentation finden Sie hier http://scand.com/products/gspread/index.html

miro
quelle
Wie ich für den von Ihnen geposteten Code sehen kann, müssen Sie sich irgendwie bei "Google Systems" anmelden. Die Alternative zum Installieren einer Office-Lizenz ist die Registrierung bei Google. Ich weiß, dass es kostenlos ist und das, aber ... Ich mag die Idee nicht, meine Anwendung in Google Services anzumelden.
EAmez