2012-09-11 8 views
14

In meiner C# -App, mit Hilfe von Excel Interop dll (als Referenz) ich Excel-Dateien lesen/schreiben. Wenn ich dieses Programm zu einem System verschiebe, in dem Office/Excel nicht installiert ist (denke an eine saubere Maschine), trete ich mit einem Fehler unterhalb ein.So erstellen Sie eine Instanz von Excel, wenn Excel nicht installiert ist

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Der obige Fehler wird erwartet, da auf dem Zielcomputer kein Excel vorhanden ist.
Meine Frage ist, gibt es eine andere Möglichkeit, mein Programm abgesehen von der Registrierung von Interop dll auf dem Zielcomputer zu verwenden?

Antwort

15

My question is, is there any other way to use my program apart from registering Interop dll on target machine?

Sie fragt, ob es eine Möglichkeit, das Programm zu verwenden, das Excel-Interop verwendet, wenn Excel nicht auf dem Computer läuft das Programm installiert ist. Die kurze Antwort ist nein. Die längere Antwort ist ja, wenn Sie bereit sind, Ihr Programm umzufunktionieren, um keine Interop zu verwenden.

Sie können den von Microsoft bereitgestellten Code OOXml SDK verwenden, wenn die Version von Excel, auf die Sie abzielen, 2007 und höher ist. Sie können auch eine Drittanbieter-Bibliothek wie Aspose verwenden, wenn Sie bereit sind, ein wenig Geld auszugeben.

Ein Beispiel für die Verwendung des OOXml SDK zum Einfügen einer Tabelle in eine Excel-Datei finden Sie unter msdn.

// 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); 
    } 
} 
+1

Danke für die Details. Ich verstehe die Gründe, auf OpenXML zuzugehen, aber leider muss ich aus anderen Gründen auf der Interop bleiben. Um das Problem zu beheben, installiere ich Excel (als Voraussetzung) für mein Programm. – Mahender

0

Von all der Forschung mit mir vor einiger Zeit tat, als ich zur Interaktion benötigt eine Excel-Datei auf einem Server, müssen Sie Office installieren.

12

Sogar Microsoft does not recommends usein Interop libraries on a server. Am besten finden Sie ein alternatives Framework, um Excel für Sie zu erstellen. Ich habe Npoi in der Vergangenheit zu diesem Zweck erfolgreich verwendet.

Ich weiß, dass dies keine Antwort auf Ihre Ausnahme ist. Aber ehrlich gesagt ist Interop ein Weg zu endlosen Schwierigkeiten und kryptischen Ausnahmemeldungen.

-Update 2017: - Bibliothek basiert auf OpenXML, die Sie moderne xlsx-Dateien erstellt, ich habe nicht NPOI für eine ganze Weile und ging all meine Projekte zu EPPlus insted verwendet.

+3

+1 für Npoi. Ich habe festgestellt, dass dies die beste freie Bibliothek für das Arbeiten mit Excel-Dokumenten ist. Funktioniert mit .xls und xlsx. – burnttoast11

+2

+1 für Npoi und "Interop ist ein Weg zu einem endlosen Problem und kryptischen Ausnahmemeldungen.". Ja, es tut wirklich weh. – NeverHopeless