myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » LateBindingApi.Excel - Framework für den versionsfreien Zugriff
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

LateBindingApi.Excel - Framework für den versionsfreien Zugriff

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150


user8744 ist offline

LateBindingApi.Excel - Framework für den versionsfreien Zugriff

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ein Projekt das ich vorstellen möchte auch mit der Absicht vielleicht den ein oder anderen Entwickler an der Mitarbeit zu interessieren, in welcher Form auch immer.

 http://excel.codeplex.com/

LateBindingApi.Excel ist ein kleines Framework für den latebinded Zugriff auf MS Excel. Die Hauptseite auf Codeplex beschreibt den Sinn und Zweck ausreichend.
Jedoch nochmal ganz kurzl: LateBindingApi.Excel ist ein ObjektModell das den latebinded Zugriff auf Excel in ein Objekt Modell kapselt das dem EarlyBind Modell(in C# den Pia's) 1:1 identisch ist.

Aufrufe wie diese

C#-Code:
excelCOMReference.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, excelReference, new object[]{1}, myThreadCulture);

werden dadurch obsolet.

Stattdessen können saubere Calls verwendet werden.

C#-Code:
string workbookName = excelApplication.Workbooks[1].Name;

Das Framework mappt den Call zu einem latebinded Auruf.
Das Framework kümmert sich ausserdem um alle COMReferencen.
Die Excel Instanz verschwindet in jedem Fall aus dem Speicher wenn man es möchte.

Ich bin im besonderen für Kritik hinsichtlich des Designs des Modell, Codes, etc. sehr empfänglich.

XlThanksForComments

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von user8744 am 04.02.2011 11:18.

04.10.2010 04:26 Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Monat.
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

XlLateBinding -> LateBindingApi.Excel

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Etwas erfreuliches:

Zum Download steht: Release LateBindingApi.Excel Release 0.7e

sowie eine Performance-Vergeichstabelle die aufzeigt wie Early, LateBinding, Dynamic Objects etc. welche Ausführungsgeschwindigkeit die jeweiligen Varianten
bieten. SourceCode der Performance-Vergleichsprojekte inklusive falls jemand selbst testen möchte.

Umbenennung zu LateBindingApi.Excel und Wechsel der Url zu
 http://excel.codeplex.com

Die alte Url tuts aber auch noch fröhlich
24.11.2010 11:49 Beiträge des Benutzers | zu Buddylist hinzufügen
Blacal Blacal ist männlich
myCSharp.de-Mitglied

Dabei seit: 10.03.2005
Beiträge: 387


Blacal ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi Sebastian,

sehr gute Arbeit.
Nur zum Verständnis: In den Beispielen, die ich gerade gestartet habe, wurde immer eine Excel Datei erzeugt und dann mit Excel geöffnet. Heißt das, dass dein Framework primär zum Erstellen von Excel-Dateien gedacht ist?
Was würde denn passieren, wenn auf einem Rechner gar kein Excel installiert wäre?

Dem Beitrag angehängt habe ich noch einen Warnhinweis, den Excel direkt nach dem Start gebracht hat. Ich vermute mal, dass im ".xlsx" Format geschrieben wird, obwohl die Dateiendung ".xls" ist.

Gruß
Roland

Blacal hat dieses Bild (verkleinerte Version) angehängt:
screen_1.png
Volle Bildgröße

24.11.2010 12:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Blacal,

Bei den Beispielen habe ich nicht bedacht das Excel 2 Dateiendungen kennt, ich werde das diese Woche korrigieren.

Grundsätzlich gibt es keine bestimme Prämisse für die Verwendung ausser eben den versionsunabhängigen Zugriff. Ansonsten ist alles möglich was auch in VBA möglich ist.

Excel muss auf dem Zielrechner zum Zeitpunkt der Verwendung installiert sein.
Das erstellen von Excel-Dateien auf diesem Weg ist aus der Sicht von Microsoft sicher 'depricated'. Die Verwendung der Spreadsheet ML ist hier zu bevorzugen.
Ich suche gerade Möglichkeiten die Verwendung der ML in das Framework zu integrieren.

Für mich persönlich sehe ich den Fokus des Frameworks vor allem in der Addin Entwicklung. Oftmals möchte man nur ein paar zusätzliche Services oder einfach nur ein paar Daten per Mausklick in ein Excel Sheet importieren. Viele Produkte bzw. Systeme bringen dazu ein Addin mit weil der Kunde es wünscht. Das Addin muss problemlos mit allen Versionen funktionieren, fallweise Events unterstützen, keinen Installationsstress verursachen und die untere Grenze ist Excel 2000(das die Spreadsheet ML nicht beherrscht). Zumindest ist das meine Erfahrung. Das Framework erfüllt diese Punkte und wird von mir in diversen Projekten auch so eingesetzt.

Gruss & falls du nen Bug findest Augenzwinkern sag Bescheid
Sebastian
24.11.2010 14:10 Beiträge des Benutzers | zu Buddylist hinzufügen
Spontifixus Spontifixus ist männlich
myCSharp.de-Mitglied

avatar-3052.gif


Dabei seit: 06.09.2005
Beiträge: 360
Entwicklungsumgebung: VisualStudio 2008/2010
Herkunft: Hannover


Spontifixus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Sebastian,

erstmal vielen Dank für die Entwicklung dieser API!

Trotzdem habe ich eine Frage, die ich auch in den mitgelieferten Beispielen nicht beantwortet finde. Wie kann ich in meinem Exceldokument eine Zeile an einem bestimmten Index hinzufügen?

Viele Grüße,
Markus :)
24.11.2010 18:45 Beiträge des Benutzers | zu Buddylist hinzufügen
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Ach herjee, die Insert Methode + Overloads für Range und ShapeNodes ist mir doch glatt durchgerutscht. Ich habe sie inzwischen ergänzt und Release 0.7f
erstellt.

Changes von Version e zu f

- XlConverter.ToRgb umbenannt zu XlConverter.ToDouble
- XlConverter.GetFileExtension hinzugefügt (.xls oder .xlsx)
- Insert Methoden+Overloads für Range und ShapeNodes
- Xml Doku im Code entfernt
25.11.2010 01:43 Beiträge des Benutzers | zu Buddylist hinzufügen
Spontifixus Spontifixus ist männlich
myCSharp.de-Mitglied

avatar-3052.gif


Dabei seit: 06.09.2005
Beiträge: 360
Entwicklungsumgebung: VisualStudio 2008/2010
Herkunft: Hannover


Spontifixus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Sebastian,

schläfst du nicht? fröhlich
Ganz herzlichen Dank für die schnelle Antwort und den Fix des Problems!

Viele Grüße aus Hannover,
Markus smile
25.11.2010 08:45 Beiträge des Benutzers | zu Buddylist hinzufügen
Spontifixus Spontifixus ist männlich
myCSharp.de-Mitglied

avatar-3052.gif


Dabei seit: 06.09.2005
Beiträge: 360
Entwicklungsumgebung: VisualStudio 2008/2010
Herkunft: Hannover


Spontifixus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo nochmal,

ich komme nicht drumrum mich nochmal zu melden. Ich versuche bei Zellen den Hintergrund zu entfernen (In Excel wäre das "No Fill"). Das kann ich aber über die Interior.Color-Eigenschaft nicht erreichen, denn sogar wenn ich Color.Transparent angebe füllt er die Zelle weiß.
Möglich sein müsste das mit der  Interior.ColorIndex-Eigenschaft, dem man dann die Konstante XlColorIndex.xlColorIndexNone übergeben kann...

Und dann möchte ich gerne Zeilen gruppieren (so dass vorne ein [+] oder ein [-] zum Auf- oder Zuklappen steht. Das sollte (wenn man diversen Google-Funden glauben darf  [klick]) die Methode  Range.Group erledigen. Auch wenn ich aus der hier verlinkten Doku nicht schlau werde...

Finale Frage: Kannst du diese Dinge noch einbauen?

Viele Grüße,
Markus :)
25.11.2010 11:07 Beiträge des Benutzers | zu Buddylist hinzufügen
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Marcus,

Ich habe die entsprechenden Features nun ergänzt, getestet und in ein neues Release gepackt.

XlRegards
Sebastian

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von user8744 am 02.12.2010 13:46.

02.12.2010 13:45 Beiträge des Benutzers | zu Buddylist hinzufügen
Spontifixus Spontifixus ist männlich
myCSharp.de-Mitglied

avatar-3052.gif


Dabei seit: 06.09.2005
Beiträge: 360
Entwicklungsumgebung: VisualStudio 2008/2010
Herkunft: Hannover


Spontifixus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Sebastian,

vielen Dank für die Umsetzung!

Viele Grüße,
Markus :)
02.12.2010 15:48 Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ein neues Release: LateBindingApi.Excel 0.9

Bisher wurde nur der gemeinsame Nenner alle Excel Versionen unterstützt.
Jetzt werden alle Funktionalitäten aller Versionen unterstützt dank
eines verbesserten Code-Generators.
Das SupportByLibrary Attribute hilft zu sehen welche Version welche Funktionalität unterstützt.

Beispiel:

C#-Code:
[SupportByLibrary("XL10","XL11","XL12","XL14","XL9")]
public class _Application : COMObject
{
    [SupportByLibrary("XL10","XL11","XL12","XL14","XL9")]
    public bool Visible

    [SupportByLibrary("XL12","XL14")]
    public bool EnableLivePreview

    [SupportByLibrary("XL14")]
    public bool PrintCommunication
}

Die ekligen Prefixe und Namespaces entfallen aufgrund der neuen Architektur.
Die Doku besteht aus 4 kleinen Dateien und ist leicht zu lesen.

Roadmap: Version 1.0 wird auch die Office Produkte Word, Outlook, Access und Frontpage unterstützen.

Danke für die Hinweise die Kritik und die Verbesserungsvorschlägedie die mich erreicht haben.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von user8744 am 02.02.2011 19:15.

02.02.2011 19:12 Beiträge des Benutzers | zu Buddylist hinzufügen
dansmo
myCSharp.de-Mitglied

Dabei seit: 08.02.2011
Beiträge: 14


dansmo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Sebastian,

vielen Dank für deine Arbeit.

Ich habe zwei Fragen:

1. Wie greife ich auf ein bestimmtes, benanntes Worksheet zu?
In deinen Beispielen finde ich nur die Möglichkeit via Nummerierung einen Abruf zu machen:

C#-Code:
objSheet = (Excel._Worksheet)objSheets[1];

Geht das auch mit dem Tabellennamen?

C#-Code:
objSheet = (Excel._Worksheet)objSheets["Signal"];

2. Wie steuere ich eine laufende Excel Anwendung und Tabelle an?
Ohne dein Latebinding habe ich das so gemacht, was jetzt aber zu einem Fehler führt:
objWorkbook =

C#-Code:
(Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file);
                    objSheets = objWorkbook.Application.Sheets;

Dazu konnte ich in deinen Beispielen leider nichts finden, dort werden Datein eher neu erstellt als das auf geöffnete Dateien zugegriffen wird. Wie geht das am besten?

Danke,
dansmo
24.02.2011 16:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo dansmo,

Die 1. Frage hatte ich ja bereits beantwortet.
Du kannst genau so gut den Namen übergeben.

Die 2. Frage
So gehts natürlich auch nicht so wie du das vor hast.
Du bekommst ja von BindToMoniker den nativen COMProxy zurück.
So gehts aber.

C#-Code:
object proxy = System.Runtime.InteropServices.Marshal.BindToMoniker(filePath + file);
Excel.Workbook book = new LateBindingApi.Excel.Workbook(null, proxy);
// your code here
book.Dispose();

Viele Erfolg

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von user8744 am 24.02.2011 17:00.

24.02.2011 16:59 Beiträge des Benutzers | zu Buddylist hinzufügen
dansmo
myCSharp.de-Mitglied

Dabei seit: 08.02.2011
Beiträge: 14


dansmo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sehr gut, danke.
24.02.2011 17:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
fod fod ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.07.2008
Beiträge: 84
Entwicklungsumgebung: Visual Studio 2010 Prof.
Herkunft: Hamburg (früher Brandenburg/Havel)


fod ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Tolles Projekt und super nutzbar! Danke.

Frage:
Durch Modifikationen müsste das doch auch für andere Produke (Office etc.) möglich sein oder?
25.02.2011 08:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo fod,

Die Klassen und Interfaces wurden von einem Tool generiert das COM TypeLibs
ausliest und daraus die LateBinding Wrapper Klassen generiert.
Dieses Tool schreibe ich gerade nochmal neu.
 http://latebindingapi.codeplex.com/

Wenn es fertig werde ich damit natürlich Wrapper für
Word, Outlook und Powerpoint erstellen.

any requests are welcome :-)

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von user8744 am 25.02.2011 21:38.

25.02.2011 15:25 Beiträge des Benutzers | zu Buddylist hinzufügen
Xander Xander ist männlich
myCSharp.de-Mitglied

avatar-3215.jpg


Dabei seit: 02.11.2010
Beiträge: 54
Entwicklungsumgebung: VS C#2010Exp., SharpDevelop
Herkunft: Sonneberg


Xander ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich hab die LateBindingAPI ja vor einiger Zeit für ein Programm benutzt, was auch erstmal toll und kompfortabel geklappt hat aber scheinbar schaufelt die API den RAM voll bei längerem gebraucht. Das fällt sicherlich bei den meisten Anwendungen garnicht auf.

Nachdem ich ewig den Fehler gesucht hatte, hab ich aus allen XlApplications, XLWorkBooks usw, wieder normale Workbooks usw gemacht und die übrigen Befehle entsprechend angepasst. Und siehe da, die Speicherauslastung meines Programms bleibt konstant bei 30MB. Mit der Api wird pro "Füge eine Zeile ans Excelfile an"-Durchlauf der Speicher voller, sodass nach ca. einem Tag die 2GB Ram voll sind.

Es ist vermutlich mal kein Anwendungsfehler meinerseits, da es ja mit den umständlichen Klassen des Interop.Excel problemlos funktioniert. Wäre schön wenn wir irgendwie rausfinden könnten wieso der angenehmere Umweg über die API den Speicher füllt.
03.03.2011 13:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
user8744
myCSharp.de-Mitglied

Dabei seit: 22.06.2007
Beiträge: 1.150

Themenstarter Thema begonnen von user8744

user8744 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Xander,

Zunächst rate ich dir natürlich zum updaten auf die neue Version.
Alles weitere per PM.

Update:
Das Problem lag in der fehlenden Verwendung von .Dispose()
Das API verursacht keine Speicherlecks.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von user8744 am 04.03.2011 17:29.

03.03.2011 15:52 Beiträge des Benutzers | zu Buddylist hinzufügen
bCoderer
myCSharp.de-Mitglied

Dabei seit: 26.09.2008
Beiträge: 101


bCoderer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Weltklasse!
07.03.2011 17:21 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 9 Jahre.
Der letzte Beitrag ist älter als 9 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.05.2020 08:36