Hallo,
ich möchte mit C# Daten in eine bereits geöffnete Datei schreiben(Excel2010).
Es geht dabei um eine Datei die immer wieder aktualisiert werden soll, bisher mache ich es so, dass ich Excel schließen lasse und dann die betreffende Datei mit den aktualisierten Daten neu öffne. Das Funktioniert soweit.
Jetzt möchte es ohne das Schließen schaffen.
Gefunden habe ich dieses Code-Snippet:
Excel.Application app = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
Excel.Worksheet sh = (Excel.Worksheet)app.ActiveSheet;
damit kann ich eine schon geöffnete Excel-Datei nutzen, funktioniert aber leider nur wenn nur eine Datei geöffnet ist, die nur ein Tabellenblatt enthält.
bei mir kann es jedoch der Fall sein das mehere Excel-Dateien geöffnet sind, und die zu aktualisierende Datei hat auch mehrere Tabellenblätter.
weiß jemand Rat?
danke schonmal für die Mühen
mfg
Das ist schon einmal ein Anfang, danke.
aber mir geht es so wie tecla, wie kann ich das zurückgelieferte object, dann schließen(also als Excel Application)
und es ist mir auch nicht klar wie man auf diese Weise erkennt in welches Tabellenblatt man schreibt.
mfg
Du musst dann entweder mit einem Index oder einem Namen auf Excel.Application.Worksheets zugreifen, wenn Du mehr als ein Sheet hast.
Hallo,
Die Rückgabewerte aus dem link sind eine Liste aus strings und eine object Variable.
In der Liste stehen die Pfade der geöffneten dateien.
comobjekt = RunningObjectTable.GetRunningCOMObjectByName(Pfad);
der methode übergebe ich den Pfad und erhalte dann:
System._ComObject
in dem snippet von oben verlangt er bei GetActiveObject einen string.
Wenn hier den Pfad aus der liste einfüge kommt der fehler:
Ausnahme von HRESULT: 0x800401F3 (CO_E_CLASSSTRING)
Sebastian könntest du mir bitte zeigen wie man das umwandelt das es funktioniert?
und wegen den worksheets das müsste dann ungefähr so gehn schätze ich:
Excel.Worksheet sh = (Excel.Worksheet)app.Worksheets[X];
oder so ähnlich...
danke
mfg
Ich habe das ROT Snippet von Rainbird mal modifiziert. Ich glaube so nützt es dir mehr.
Schau einfach nochmal rein: Laufende COM-Objekte abfragen
Vielen Dank Sebastian,
habs hinbekommen in eine geöffnete Datei mit mehreren Arbeitsblättern zu schreiben.
auf die art rufe ich das auf:
table = RunningObjectTable.GetApplicationInstancesFromROT("QListe.xls", "Workbook");
Excel.Workbook wb2 = table[0] as Excel.Workbook;
und so nutze ich die einezlenen Blätter:
Excel.Worksheet worksheet = (Excel.Worksheet)wb2.Worksheets[1];
weiß jetzt nicht sicher ob der Code so schön ist oder richtig gut, aber immerhin funktionierts bei mir so.
danke nochmal
mfg