Laden...

NetOffice - Ein versionsunabhängiger Wrapper für MS-Office

Erstellt von gelöschtem Konto vor 13 Jahren Letzter Beitrag vor 10 Jahren 71.414 Views
Gelöschter Account
vor 13 Jahren
NetOffice - Ein versionsunabhängiger Wrapper für MS-Office

Fragen zur Entwicklung mit NetOffice z.B. wie sende ich eine E-Mail oder wie öffne ich ein Word Dokument bitte im Forum Office-Technologien und nicht hier.

**
NetOffice - .NET Wrapper Assemblies für den Zugriff auf Microsoft Office, Excel, Word, Outlook, PowerPoint, Access

http://netoffice.codeplex.com **

  • Office Integration ohne Versionsbeschränkung

  • Alle Objekte, Methoden, Properties und Events der Office Versionen 2000, 2002, 2003, 2007, 2010 enthalten

  • Attribute Konzept und XML Source Doku zur Information welche Office Version(en) die jeweilige Methode oder Property anbietet (siehe angehängtes Bild)

  • Syntaktisch und semantisch identisch zu den Interop Assemblies

  • Reduzierter und besser lesbarer Code durch automatische Verwaltung von COM Proxies

  • Keine Deployment Hürden, keine problematische Registrierung, keine Abhängigkeiten, keine Interop Assemblies, kein VSTO notwendig

  • Mit jeder .NET Version ab 2.0 verwendbar

  • Problemlose Addin Entwicklung

  • Dokumenation und Beispielprojekte inkl. Addins für alle Office Produkte in C# und VB.NET auch online verfügbar

Beispielcode für die Erstellung eines neuen TaskItem in Outlook(Example02.csproj)


   // Initialize Api COMObject Support
   LateBindingApi.Core.Factory.Initialize();

   // Create an Outlook Application object. 
   Outlook.Application outlookApplication = new Outlook.Application();

   // Create a new TaskItem.
   Outlook.TaskItem newTask = outlookApplication.CreateItem(OlItemType.olTaskItem) as Outlook.TaskItem;

   // Configure the task at hand and save it.
   newTask.Subject = "check for NetOffice.DeveloperToolbox updates";
   newTask.Body = "check updates here: http://netoffice.codeplex.com";
   newTask.DueDate = DateTime.Now;
   newTask.Importance = OlImportance.olImportanceHigh;
   
   newTask.Save();
           
   // close outlook and dispose
   outlookApplication.Quit();
   outlookApplication.Dispose();

Fragen, Kritik, Verbesserungsvorschläge und Bug Reports sind natürlich sehr willkommen.

Schlagwörter: Office Excel Word Outlook PowerPoint Access

Screenshot: IntelliSense Unterstützung in C# für Versionsinformation eines Property.

.
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sebastian,

habe NetOffice getestet und finde es super 😃 Richtig schnell und im Vergleich zum normalen LateBinding einfach zu programmieren.

Was evtl. noch fehlt, ist eine Signierung der DLLs.

1.378 Beiträge seit 2006
vor 12 Jahren

Habs nicht probiert aber auf sowas habe ich schon lange gewartet!!! 😃

Hoffe bald einmal das Framework einsetzen zu können.

Lg, XXX

Gelöschter Account
vor 12 Jahren

Hallo Heinz

Die Signierung ist eine sinnvolle Option für eine Version 1.0 denke ich.
Momentan ist ja noch 0.8 Alpha(stable)

Sebastian

M
120 Beiträge seit 2009
vor 12 Jahren

Klingt sehr gut. Gibt es auch die Möglichkeit beim Erstellen anzugeben, welche (minimale/exakte) Application-Version verwendet werden soll?

Also für den Fall, dass mehrere Installiert sind und man sich daher nicht sicher sein kann, dass gerade die gewünschte Version als Standardanwendung eingetragen ist.

1.665 Beiträge seit 2006
vor 12 Jahren

Sehr gute Arbeit! Werde ich mir mal anschauen. Könnte das gut gebrauchen.

906 Beiträge seit 2005
vor 12 Jahren

danke das schaue ich mir mal an.

Wie sieht es mit 32/64Bit (AnyCPU) Kompatibilität aus? Was muss man da alles beachten?

Gelöschter Account
vor 12 Jahren

Hallo MagicAndre,
Guter Punkt!
Ich erstelle gerade einen kleinen Guide bzw. kurze Übersicht zu dem Thema.
Release 0.9 (Beta) wird auch x64 Assemblies für alle .NET Versionen ab .NET 2.0 enthalten. Das Release erscheint in der Nacht vom 5. zum 6. Juni also spätestens kommenden Montag morgen 😉 UPDATE: Seperate Assemblies für andere Plattformen sind nicht nötig. NetOffice funktioniert auch plattformunabhängig.

Hallo Marsti,
Ja, du kannst dem Application Objekt im Constructor die gewünschte ProgId übergeben und damit eine spezifische Version starten.

Sebastian

Edit: Das Release wird sich wohl verzögern da sich Office x64 prinzipiell nicht auf WindowsXP(x64) installieren lässt und ich kein anderes System zu Hause habe. Schade.

906 Beiträge seit 2005
vor 12 Jahren

Ich erstelle gerade einen kleinen Guide bzw. kurze Übersicht zu dem Thema.
Release 0.9 (Beta) wird auch x64 Assemblies für alle .NET Versionen ab .NET 2.0 enthalten.

Danke 👍

.
134 Beiträge seit 2009
vor 12 Jahren

Die Signierung ist eine sinnvolle Option für eine Version 1.0 denke ich.

Das wäre super 😁 Wäre schade, wenn man die DLL nicht in signierten Projekten einsetzen könnte, denn die Komponente ist super.

906 Beiträge seit 2005
vor 12 Jahren

ah, noch etwas. Wird es das Projekt auch als NuGet Paket geben?

@Sebastian.Lange

installiere die 90 Tage Win7 x64 Trial, da kannst du es testen.

Gelöschter Account
vor 12 Jahren

Ich habe von NuGet bisher nur gelesen, ich muss mich erstmal informieren was ich dazu tun müsste. Wenns ohne Hürden umsetzbar ist, klar warum nicht.

EDIT 08.07.2011: Nein, auch Version 1.1 wird es nicht als NuGet-Paket geben.

Ich wusste nicht das Windows7 x64 als Trial erhältlich ist. Danke für den Tipp!
Ich bin mir sicher das neue Release diese Woche noch fertig zu bekommen.

Gelöschter Account
vor 12 Jahren

Ich habe Release 0.9 soeben fertig gestellt und in der technischen Dokumentation einen entsprechnden Eintrag zur 32Bit/64Bit Thematik verfasst.

Documentation > Tec_Documentation_German > Tec_Documentation_German_32Bit_64Bit

Sofern der Fragen offen lässt solls mir doch bitte einer sagen 😉

906 Beiträge seit 2005
vor 12 Jahren

ok, ich spiele nun etwas damit rum.

Eine Frage. Warum packst du die große RAR immer mit in die Quellcodeverwaltung?

Gelöschter Account
vor 12 Jahren

Du meinst das Release Tag?
Bei kleineren Bugfixes bzw. Anpassungen/Erweiterungen update ich das Tag ohne auf der Codeplex Seite jedesmal ein neues Release zu erstellen. Wenn du z.B. ein Issue erstellst kümmere ich mich sofort um den Fehler und update dieses Release Tag quasi noch am gleichen Tag. Das Release auf der Webseite muss immer etwas warten. 3 neue Releases am Tag würden keinem nützen glaube ich.

906 Beiträge seit 2005
vor 12 Jahren

Du meinst das Release Tag?

ja, ich will nur den trunk. Kannst du die Quellcodeverwaltung aufsplitten in trunk, tags, branches und dann wenn du eine Version fertig hast erstellst du einen Tag und keine RAR? SVN und große Dateien ist nicht wirklich schnell. TSVN kackt öfters mal ab und ich muss aufräumen und nochmals updaten.

M
5 Beiträge seit 2006
vor 12 Jahren

Hallo,

lassen mit NetOffice auch die Office-Anwendungen in die eigene Applikation einbetten?

Ich muss für ein aktuelles Projekt Excel-Dateien innerhalb meiner Anwendung anzeigen. Bisher habe ich es mit einem WebBrowser-Control versucht. Dies funktioniert jedoch ohne Änderung an der Registry nicht richtig.

Daniel

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

@ManiacViper:
Der Wrapper ist lediglich als background-Worker gedacht, d.h. Office-Dokumente erstellen und bearbeiten. Für die Anzeige musst du leider andere Wege gehen.

Nobody is perfect. I'm sad, i'm not nobody 🙁

360 Beiträge seit 2005
vor 12 Jahren

Hallo Sebastian,

coole API - ich brauche sie gerade wieder für ein kleines Projekt. Vielen Dank dafür!

Und (wie könnte es anders sein) dazu gleich eine Frage. Ich muss mit meinem Programm große Datenmengen (>50.000 Zeilen, 6 Spalten) in Excel importieren. Wenn ich die händisch (Zelle für Zelle) hinzufüge dauert das ewig.
Gibt es eine Möglichkeit das zu beschleunigen, beispielsweise über einen CSV-Import?

EDIT: Da habe ich wohl nicht klar genug formuliert. Die Frage bezieht sich ganz konkret auf die netoffice-API: Ist ein CSV-Import mit dieser API möglich? Und wenn ja, wie?

Viele Grüße,
Markus 😃

Hinweis von herbivore vor 12 Jahren

Bitte die Frage nur in direktem Bezug zu "NetOffice - Ein versionsunabhängiger Wrapper für MS-Office" beantworten, denn wir sind hier in ".NET-Komponenten und C#-Snippets" und nicht in "Entwicklung".

M
46 Beiträge seit 2010
vor 12 Jahren

Moin moin,

die API hört sich Interessant an. Leider bin ich noch nicht dazugekommen sie mal zu testen.
Aber eine Frage habe ich schon. Muss auf dem Zielrechner des Anwenders Office installiert sein?

Mfg.
Mr. Bob

1.029 Beiträge seit 2010
vor 12 Jahren

Hallo,
ja - Office muss installiert sein - die API ist "nur" eine LateBinding-Wrapper um
die OfficeAPI - Vorteil: Es muss keine bestimmte Office-Version installiert sein.

Es handelt sich dabei nicht um eine vollständig neue Implementierung der OfficeAPI 😁

LG
Achim

Gelöschter Account
vor 12 Jahren

Hallo Heinz,

NetOffice Release 1.0 mit signierten Assemblies ist jetzt online. Siehe erster Beitrag.

.
134 Beiträge seit 2009
vor 12 Jahren

Habs getestet. Wunderbar 😃

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

@Spontifixus:
Da müsstest du mal prüfen, ob das mit der Open-Funktion möglich ist, oder ob es dafür eine spezielle Import-Funktion gibt.

Nobody is perfect. I'm sad, i'm not nobody 🙁

C
182 Beiträge seit 2006
vor 12 Jahren

Genial!
Ich habe zwar nur Excel getestet, muss aber sagen: Hut ab! Auch allem wg. der vielen Arbeit, die ganzen Properties nachzubauen und alles so fein zu dokumentieren und zu "bebeispielen".

Nur zur Info: Ich habe bisher versucht:

  • direktes COM: ist an Unterschieden zwischen den Excelversionen gescheitert
  • Xml-Writer von CarlosAg: ein recht gutes Teil, wenn man nur schreiben will, läuft voll ohne Excel. Ich aber muss in bestehende Blätter schreiben, und da gibts Schwierigkeiten mit der Zelladressierung.
  • Ado.Net: immer wieder Fehler "Installierbares Isam nicht gefunden" auf diversen Maschinen in freier Wildbahn.

-christoph

Gelöschter Account
vor 12 Jahren

Dankeschön, NetOffice ist allerdings nicht von Hand gemacht sondern mit einem Codegenerator erstellt den ich dafür entwickelt habe, den gibt es auch auf Codeplex.

Nochwas: Eine italienische IT-Firma ist an mich heran getreten ob es möglich ist MS-Project zu integrieren. Dankenswerte Weise wurden mir die beiden verfügbaren MS-Project Versionen(2007 und 2010) dafür zur Verfügung gestellt. In den nächsten Tagen werde ich das umsetzen jedoch fehlt mir jede Kentniss über das Produkt. Wenn jemand Lust hat sich dem NetOffice Team anzuschliessen und ein wenig Beispielcode dafür zur schreiben zu stellen wäre das toll. Eine Liste welche OpenSource Projekte inzwischen von Interop und VSTO auf NetOffice umgestellt haben veröffentliche ich demnächst.

Gelöschter Account
vor 12 Jahren

Es gibt ein neues Release

NetOffice Release 1.1

Es behebt einen kritischen Fehler im Eventsystem von NetOffice.
Sie dazu Issue 16314

Der Support für MS-Project verzögert sich leider etwas da die Italiener ausgesprochen träge reagieren was die Tests betrifft.

360 Beiträge seit 2005
vor 12 Jahren

Hallo Sebastian,

danke für den Hinweis, ich hab das wie von dir vorgeschlagen über Copy'n'Paste (CSV-Daten in die Zwischenablage kopieren und dann in den entsprechenden Bereich kopieren) gelöst. Das funktioniert extrem schnell.

Viele Grüße,
Markus 😃

S
74 Beiträge seit 2005
vor 12 Jahren

Hallo Sebastian,
super Arbeit!
Kann man das "Speichern als PDF" auch über deinen Wrapper ausführen?

Grüße
ebenfalls Sebastian

1.029 Beiträge seit 2010
vor 12 Jahren

Hallo,

diese Antwort übernehme ich dann einfach mal 😛

NetOffice ist ein Wrapper - wenn etwas über das Objektmodell geht, dann kann es meines Wissens nach auch NetOffice.

Der einfachste Weg ist finde ich den "Makro-Recorder" anzuwerfen, die gewünschte Aktion durchzuführen und sich danach den VBA-Code anschauen,
wie ich es nachfolgend getan habe.

Der aufgenommene VBA-Code sieht so aus:

Sub ExportActiveDocAsPdf()
    ActiveDocument.ExportAsFixedFormat OutputFileName:= _
        "Dateiname.pdf", ExportFormat:=wdExportFormatPDF, _
        OpenAfterExport:=True, OptimizeFor:=wdExportOptimizeForPrint, Range:= _
        wdExportAllDocument, From:=1, To:=1, Item:=wdExportDocumentContent, _
        IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
        wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:= _
        True, UseISO19005_1:=False
End Sub

Daraus macht man dann in C# beispielsweise folgendes:

			// export the newly created document as a pdf
			newDocument.ExportAsFixedFormat(@"Dateipfad.pdf", WdExportFormat.wdExportFormatPDF, 
				false, WdExportOptimizeFor.wdExportOptimizeForPrint, WdExportRange.wdExportAllDocument, 1, 1, 
				WdExportItem.wdExportDocumentContent, true, true, WdExportCreateBookmarks.wdExportCreateNoBookmarks, true, true, false);

Eine lauffähige Version könnte dann so aussehen:

using NetOffice.WordApi.Enums;
using Word = NetOffice.WordApi;

namespace ConsoleApplication3
{
	class Program
	{
		static void Main(string[] args)
		{
			// Initialize Api COMObject Support
			LateBindingApi.Core.Factory.Initialize();

			// start word and turn off msg boxes
			Word.Application wordApplication = new Word.Application();
			wordApplication.DisplayAlerts = WdAlertLevel.wdAlertsNone;

			// add a new document
			Word.Document newDocument = wordApplication.Documents.Add();

			// insert some text
			wordApplication.Selection.TypeText("This text is written by NetOffice");

			// export the newly created document as a pdf
			newDocument.ExportAsFixedFormat(@"Dateipfad.pdf", WdExportFormat.wdExportFormatPDF, 
				false, WdExportOptimizeFor.wdExportOptimizeForPrint, WdExportRange.wdExportAllDocument, 1, 1, 
				WdExportItem.wdExportDocumentContent, true, true, WdExportCreateBookmarks.wdExportCreateNoBookmarks, true, true, false);

			// close document unsaved
			newDocument.Close(false, null, null);

			// exit word
			wordApplication.Quit();
			wordApplication.Dispose();
		}
	}
}

LG
Achim

S
74 Beiträge seit 2005
vor 12 Jahren

Super, vielen Dank. Ich probier' das dann mal! 😃

.
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sebastian,

wie sieht es mit Nuget aus? Ist da etwas geplant? 😁

Gelöschter Account
vor 12 Jahren
NetOffice Release 1.2

Ab sofort verfügbar ist:

NetOffice Release 1.2

  • IntelliSense zeigt nun zusätzlich für Properties "Get" oder "Get/Set"
  • Unterstützung für MS-Project 2007 und 2010
  • Deutliche Performance Verbesserung

Ein ausführlicher Performance Vergleich ist nun zusätzlich verfügbar:

Performance Vergleich: Interop, Dynamics, Visual Basic, NetOffice

Geplant für Release 1.3

  • Unterstützung für ältere MS-Project Versionen
  • Unterstützung für MS-Visio (wurde angefragt)
  • Weitere Vorschläge durch Community Feedback willkommen

Die fetten ReleaseTags im Quellcode habe ich entfernt.

906 Beiträge seit 2005
vor 12 Jahren

danke, nun noch ein NuGet Package und ich bin glücklich. NuGet ist das beste was ist seit langen bei .Net gibt. Aktuell muss man sich deine Version laden, sie in seinem eigenen Projekt in einem Ordner einfügen sowie in die Versionskontrolle packen. Mit NuGet kann man sich das alles sparen.

Gelöschter Account
vor 12 Jahren

Hallo,
Ich erkenne den sinvollen Grundgedanken von Nuget und bei den häufigen NetOffice Releases der letzten Zeit wäre das sicher sehr nützlich gewesen. Jedoch habe ich mich nach gründlichem Überlegen dazu entschlossen vorläufig kein Nuget Packet anzubieten da ich mit einigen Aspekten der technischen Umsetzung nicht einverstanden bin. Ich würde das Thema gerne in in einem extra Thread weiter diskutieren sofern du magst.

D
615 Beiträge seit 2009
vor 12 Jahren

[noch mehr offtopic]

Hallo 😃

Ich möchte einfach mal DANKE sagen ! Gute Arbeit ! 😃

Beste Grüsse

Diräkt

[/noch mehr offtopic]

Gelöschter Account
vor 12 Jahren

Ab sofort verfügbar ist die NetOffice Developer Toolbox.

Die Developer Toolbox ist ein Productivity Tool für den Office-Entwickler.
Es umfasst die folgenden Funktionalitäten:

**- Office Compatibility

  • Application Observer
  • Registry Editor
  • Addin Guard
  • Outlook Security**

Die Dokumenation befindet sich hier:
Developer Toolbox Online Dokumenation

Ich möchte die einzelnen Funktionen ganz kurz umschreiben.

Office Compatibility

Wer eine Office Lösung entwickelt die mit mehreren oder allen Office Versionen kompatibel sein muss, steht vor dem Problem das er nur die Funktionalitäten ansprechen darf die in allen unterstützen Versionen zur Verfügung stehen. NetOffice bietet daher als einzige API einen entsprechenden Hinweis als IntelliSense Text, während der Entwicklung an, von welcher Office Version die jeweilige Funktionalität unterstützt wird. Auch wenn dieses Feature eine grosse Hilfe darstellt, reicht es in der Praxis nicht aus um sicherzustellen das man mit allen Versionen einer Office Anwendung kompatibel ist. Die Office Compatibility Komponente führt eine statische Code-Analyse mit Hilfe von Mono.Cecil durch und analysiert Assemblies die NetOffice verwenden darauf mit welchen Office Versionen sie kompatibel sind. Eine entsprechende Übersicht hilft dem Entwickler die inkompatiblen Aufrufe zu identifizieren.

Application Observer

Wer über längere Zeit an grösseren Office Lösungen arbeitet kennt das Problem.
Ein Fehler triff auf, der Debugging Prozess wird abgebrochen, vorhandener Cleanup Code wird damit nicht ausgeführt. Die Instanz der Office Anwendung wird nicht beendet und verbleibt im Speicher. Schnell befinden sich innerhalb weniger Minuten viele dieser verwaisten Instanzen im Speicher die via Task-Manager entfernt werden müssen. Der Application Observer überwacht die Anzahl laufender Instanzen von ausgewählten Office Anwendungen und zeigt diese Information auf Wunsch als Tray-Icon an. Darüber hinaus kann man einen systemweiten Hotkey festlegen um diese Instanzen schnell und unkompliziert zu entfernen. Die Hotkey Klasse stammt dabei von MyCSharp. Vielen Dank an Floste. Einen entsprechenden Hinweis im Code und in der About Box habe ich natürlich nicht vergessen.

Registry Editor

Der Registry Editor ist ein technischer und optischer Klon des bekannten Windows Registry Editors. Er bietet jedoch nur die Schlüssel für MS-Office an. Nerviges scrollen wird dadurch überflüssig.

Addin Guard

Entwickler die COMAddins für eine Office Anwendung schreiben haben oft das Problem das Sie nicht sicher sind ob Ihr Addin ordnungsgemäss geladen wird.
Bei einem auftretenden Fehler, z.B. einer fehlenden Abhängigkeit setzen Office Anwendungen das Ladeverhalten von Addins komentarlos zurück oder markieren es als deaktiviert. Viele Entwickler bauen daher MessageBox Ausgaben in ihren Code und prüfen permanent mit nervösem Blick die Registry-Werte Ihres Addins.
Addin Guard schafft hier Abhilfe in dem es das Ladeverhalten von Addins also ihren Aktivierungsstatus überwacht und ein Meldungsfenster oder eine Tray-Benachrichtung anzeigt wenn sich das Ladeverhalten ändert. Auf Wunsch kann Addin Guard das Ladeverhalten auch direkt zurücksetzen.

Outlook Security

Ein Entwickler der MS-Outlook via COM ansprechen bzw. automatisieren möchte steht vor dem Problem das Outlook einen Security Dialog einblendet, der zur Autoriserung auffordert, wenn man auf bestimmte Teile des Objektmodells zugreift. Mit Einführung dieses Sicherheits-Features wurde sehr schnell ein Tool mit dem Namen ClickYes populär das im Hintergrund läuft und diesen Dialog automatisch bestätigt. Outlook Security tut es dem bekannten Tool ClickYes nach indem es diesen Dialog automatisch bestätigt und hat darüber hinaus noch einen weiteren Vorteil. Die tatsächliche Funktionalität ist in das beiliegende Assembly NetOffice.OutlookSecurity.dll ausgelagert. Wer möchte kann dieses Assembly nutzen oder den Source Code direkt einbinden. Ein Addin kann damit seine eigene ClickYes Funktionalität mitbringen und auf dem Zielsystem muss kein extra Tool installiert werden. Wie man das Assembly NetOffice.OutlookSecurity.dll nutzt ist in der Online Dokumentation beschrieben.

Zum Download gehts hier

Die Developer Toolbox benötigt das .NET 4 Framework.
Das Client Profile ist dabei ausreichend.

Gelöschter Account
vor 12 Jahren

Für die Toolbox gibt es ein Update(Version 0.8.2) das 2 Bugs in der Office Compatibility Komponente behebt. Der 1.Bug verursachte eine Fehlermeldung während der Assembly Analyse, der 2. Bug verursachte eine falsche Anzeige im Filter-Modus des anschliessenden Reports.

Edit: Gleich noch ein Update(Version 0.8.3) hinterher.
Die Office Compatibility Komponente hat jetzt 73 Test Assemblies erfolgreich passiert. In Version 0.9 wird der detailierte Report der Analyse übersichtlicher und ansprechender aussehen und darüber hinaus auch direkt speicherbar sein

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Habe NetOffice heute auch mal getestet: Läuft wirklich toll.

Evtl. noch ein kleiner Hinweis:
Wenn man z.B. Application in einer using-Anweisung verwendet, erwarte ich, dass neben Dispose gegebenenfalls weitere Methoden (z.B. Quit) automatisch aufgerufen werden.

Zusätzlich sollte evtl. auch ein Destructor eingerichtet werden (siehe auch Dispose implementieren und verwenden (IDisposable)), welcher Dispose(false) aufruft.

Ich benutze zwar z.Zt. noch einen eigenen Wrapper, bin aber geneigt, auf NetOffice umzusteigen.

Nobody is perfect. I'm sad, i'm not nobody 🙁

Gelöschter Account
vor 12 Jahren

Danke für deinen Hinweis. Quit() für Applications am Ende eines using Blocks aufzurufen ist eine sinnvolle Sache aber eben auch nur in diesem Context.
Ansonsten darf Quit() nie automatisch aufgerufen werden auch nicht wenn das Objekt vom GC entsorgt wird. Oft genug will man das die Anwendung weiterlebt auch wenn man sich technisch von ihr getrennt hat.

Ich muss erstmal intensiv drüber grübeln.
Das Proxy Management ist eine BasisApi (LateBindingApi.Core) verpackt.
Diese weiss natürlich nichts über irgendwelche Quit Methoden und soll es auch nicht. Möglich wäre es allerdings trotzem, wenn ich den Application Objekten ein zusätzliches Interface(IQuit o.ä.) spendiere. Ich werde nach dem Ende meiner Überlegungen meinen Entwurf hier kurz vorstellen.

In eigener Sache:
Die Developer Toolbox in der Version 0.8.6 ist online mit einer technisch und optischer verbesserten Office Compatibility Komponente.

Gelöschter Account
vor 12 Jahren

Ab sofort verfügbar ist NetOffice 1.3

Neue Features im Überblick:

  • Mehr Überladungen für Methoden mit optionalen Parametern
  • Einfache Prüfung zur Laufzeit möglich ob ein spezfisches Feature zur Verfügung steht
  • Enumeratoren für Listen ohne nativen Enumerator Support
  • Integrierte Debug Console
  • Verbesserter Beispielcode
  • Developer Toolbox 0.9

Mehr Überladungen für Methoden mit optionalen Parametern

NetOffice kann leider keine optionalen Parameter anbieten da viele Methoden Überladungen haben die in unterschiedlichen Office-Versionen definiert sind. Würde NetOffice diese zu einer einzigen Methode mit optionalen Parametern zusammenfassen würde die Information verloren gehen welche Version die jeweilige Methode anbietet. Ich hatte deswegen in der Vergangenheit viel Mail-Verkehr quer über die ganze Welt, Leute die mir Beispielprojekte mit optionalen Parametern geschickt und Vorschläge gemacht haben, vielen Dank dafür. Die Information welche Office Version die jeweilige Methode anbietet wird in NetOffice via XML Dokumentation als IntelliSense angezeigt. Ich möchte diese IntelliSense Unterstützung nicht zugunsten der optionalen Parameter opfern. Ich bin schon ein wenig stolz darauf das versionsunabhängige Office-Entwicklung mit NetOffice nicht einfach nur möglich ist sondern das man hierbei auch aktiv unterstützt wird. Dafür gibt es nun 3 zentrale Features:

1.) Während der Entwicklung durch die XML Dokumentation die anzeigt welche Office Version die jeweilige Funktionalität anbietet

2.) Nach der Entwicklung durch die Developer Toolbox die eine Code Analyse durchführt und dem Entwickler aufzeigt mit welchen Office Versionen sein Code funktioniert

3.) Das neue EntityIsAvailable Feature (siehe unten) das ermöglicht zur Laufzeit zu ermitteln ob eine Funktionalität zur Verfügung steht

Es wäre schade diese besondere Trademark von NetOffice aufzuweichen daher bietet NetOffice keine optionalen Parameter. Als Ersatz für Methoden mit optionalen Parametern bot NetOffice bisher jeweils eine minimale und eine maximale Funktionsüberladung an. In solche Fällen wo Methoden sehr viele optionale Parameter enthalten und der Entwickler nur einen oder wenige davon nutzen wollte ist dies jedoch nicht optimal, daher gibt es nun für Methoden mit optionalen Parametern nun die entsprechend Anzahl an Überladungen wie optionale Parameter existieren. Ich hoffe damit einen adäquaten Ersatz für optionale Parameter hergestellt zu haben.

Einfache Prüfung zur Laufzeit möglich ob ein spezfisches Feature zur Verfügung steht

Oftmals ist es hilfreich und sinnvoll zur Laufzeit zu prüfen ob ein bestimmtes Property oder Methode von der aktuellen Office Version angeboten wird.
Daher bietet jedes Objekt in NetOffice nun die Metode 'bool EntityIsAvailable(string name);' an. Dazu ein Beispiel:

// Neue E-mail in Outlook erstellen
Outlook.MailItem mailItem = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem;

// BodyFormat ist nicht verfügbar in Outlook 2000, wir prüfen zur Laufzeit ob es zur Verfügung steht
if(mailItem.EntityIsAvailable("BodyFormat"))
    mailItem.BodyFormat = OlBodyFormat.olFormatPlain;

mailItem.Body = "kind regards from NetOffice;
mailItem.Subject = "Hello";
mailItem.Display();
mailItem.Close(OlInspectorClose.olDiscard);

Enumeratoren für Listen ohne nativen Enumerator Support

Einige Auflistungstypen in Office, insbesondere in Outlook verfügen über ein Default Item(in .NET bekannt als this indexer), einen Count,
jedoch leider nicht über einen Enumerator der ein einfaches foreach ermöglicht. In den von Microsoft seperat breit gestellten Primary Interop Assemblies wurden diese Enumeratoren daher manuell ergänzt. NetOffice tut das jetzt auch. Eine Liste welche Objekte dies betrifft findet sich hier:Issue #16739

Integrierte Debug Console

Die Debug Console enthält eine bewusst simpel gehaltene Log-Funktion, sie zeichnet automatisch alle COMExceptions auf die bei der Interaktion mit Office auftreten. Ich erhoffe mir dadurch einen schnelleren und besseren Support im NetOffice Discussion Board. Wer von Office eine Exception bekommt und dazu eine Frage im Board oder hier im Forum Office-Technologien stellen möchte, fügt den Inhalt der Debug Console seinem Posting an, so kann Ihm oder Ihr schneller geholfen werden.

Verbesserter Beispielcode

Der Beispielcode wurde hinsichtlich der neuen Features überarbeitet, dazu gibt es 2 neue Beispiele und ein 1 neues Tutorial für die Nutzung von EntityIsAvailable und der Debug Console.

Developer Toolbox 0.9

Die Developer Toolbox hat nun technisch und optisch ihren finalen Stand erreicht.
Da NetOffice 1.3 neue Funktionsüberladungen und zusätzliche Enumeratoren mitbringt, ist ein Update der Developer Toolbox auf Version 0.9 erforderlich wenn man die Office Compatibility Komponente für die Code-Analyse nutzt.

In diesem Sinne liebe Freunde, happy Coding!

.
134 Beiträge seit 2009
vor 12 Jahren

Das kling super. Gleich mal testen.

Gelöschter Account
vor 12 Jahren

Hallo,

Ich habe ein kurzes Update nachgeschoben. Grund ist das Issue #17015

Einige wenige Methoden in Office verwenden Out Parameter. NetOffice hatte das jedoch aufgrund meiner Unachtsamkeit bisher nicht unterstützt bzw. die betreffenden Parameter nicht mit dem out Qualifizerer angeboten. Dieses Missgeschick ist nun behoben.

R
100 Beiträge seit 2009
vor 12 Jahren

@Sebastian.Lange: Erstmal vielen Dank für tolle Bibliothek. Ich hätte gern eine Frage über die Meldung von Bibliothek. Wenn Frage in diesem Thread nicht erlaubt ist, bitte für mich in richtigen Ort verschieben. Danke.

Stand: Ich habe auf meinem Rechner Microsoft Office 2010 installiert außer MS Access. Ich nutze noch die Version 2003 für MS Access. Bitte siehe Anhang.

Frage: Ich würde gern mit deiner Bibliothek alle Kontrolle von aller Formularen in einer MS Access Dateien ermitteln. Der Code sieht ungefähr so aus


LateBindingApi.Core.Factory.Initialize();

Access.Application application = new Access.Application();
try
{
	application.OpenCurrentDatabase(@"D:\Temp\tri.mdb", false);

	foreach (AccessObject frm in application.CurrentProject.AllForms)
	{
		application.DoCmd.OpenForm(frm.Name, Access.Enums.AcFormView.acDesign, Missing.Value, Missing.Value, Access.Enums.AcFormOpenDataMode.acFormPropertySettings, Access.Enums.AcWindowMode.acWindowNormal);

		foreach (var contron in application.Forms[frm.Name].Controls)  //Hier tritt Fehler auf
		{
			//Tu was
		}
                application.DoCmd.Close(Access.Enums.AcObjectType.acForm, frm.Name, Access.Enums.AcCloseSave.acSaveYes);
	}
}
catch (Exception ex)
{
	Console.WriteLine(ex.Message);
}

Ich habe dann Exception bekommen. Es lautet
"Class not exists: NetOffice.AccessApi.Checkbox"
"Class not exists: NetOffice.AccessApi.Combobox"

Wie konnte ich diese Meldung verstehen? Danke.

Gelöschter Account
vor 12 Jahren

Hallo,
Da es sich -möglicherweise- um ein Fehlverhalten der API handeln könnte ist das Posting hier meiner Ansicht nach berechtigt, die Lösungssuche erfolgt dann allerdings via PM. Wenn klar ist was passiert ist sollte man die Auflösung natürlich anschliessend hier posten. Daher hast du jetzt auch gleiche eine PM von mir.

Gelöschter Account
vor 12 Jahren

So, wie sich rausstellte handelte es sich tatsächlich um einen -quasi- Fehler.

NetOffice untersucht COM Proxies zur Lauzfzeit und ermittelt die namensgleiche Wrapper Klasse, so wird einem Proxy vom Typ Application in Word automatisch die Wrapperklasse NetOffice.WordApi.Application zugeordnet. Im hier vorliegenden Fall
hat der Proxy seinen Namem einfach klein geschrieben zurück gegeben was ich so noch nie erlebt habe.

Ich habe nur einen einzige Zeile im Code ändern müssen damit nichts mehr case-sensitive läuft 😉 Behoben!

Gelöschter Account
vor 12 Jahren

Ich habe soeben das NetOffice Release 1.4 veröffentlicht.

Was ist neu?:

  • Alle Auflistungsklassen implementieren jetzt IEnumerable<T> und werden dadurch Linq fähig
  • Kleine Bugfixes darunter auch das Issue 17551
  • Für Properties mit (optionalen) Parametern steht jetzt auch eine gleichnamige Funktion ohne" get"_ oder "set_" zur Verfügung
  • Die Developer Toolbox Office Compatibility Komponente ist auf das 1.4 Release geupdatet.

Ankündigung:

Die nächste NetOffice Version wird in VB.NET implementiert sein(bis auf den Kern)
Auswirkungen für C# Entwickler entstehen dadurch allerdings nicht. Es geht im nächsten Release darum den bestehenden VBA Code dieser Welt via Copy'n'Paste zu VB.NET portierbar zu machen. Das ist mit C# jedoch nicht zu erreichen. Ausserdem wird sich die nächste Version nach aussen als COM Interop Assembly darstellen, dies ermöglicht ein direktes einbetten der NetOffice Assemblies. Damit das eigene Assembly dabei nicht übermässig aufgebläht wird gibt es dafür in der Developer Toolbox eine Shrink Komponente die eine abespeckte NetOffice Version basierend auf dem eigenen Assembly erstellt. Anmerkungen/Wünsche und Vorschläge sind mir dazu natürlich willkommen.

EDIT: Ich habe inzwischen festgestellt das Visual Basic einige Unzulänglichkeiten mitbringt die eine Umstellung auf VB.NET vielleicht unmöglich machen. Just for Info

Gelöschter Account
vor 12 Jahren

Hallo,

Ich habe soeben ein Update auf das Release 1.4.1 online gestellt.

Im Release 1.4.0 hatte sich bedauerlicher Weise ein Fehler im neu eingeführten SafeMode eingeschlichen. Der SafeMode(bool Settings.EnableSafeMode;) dient dazu nicht vorhandene Funktionalität einer Office Version automatisch zu erkennen und beim Aufruf eine EntitityNotSupportedException auszulösen. Entwickler können ihre Fehlerbehandlung dadurch besser anpassen bzw. besser erkennen das es sich um eine nicht unterstützen Aufruf handelt. Das Feature wird durch einen Cache unterstützt der fälschlicher Weise bei Dispose Aufrufen gelöscht wurde, ausserdem war der SafeMode per Voreinstellung aktiviert was natürlich nicht sein sollte und das Problem verschärft hat.

Ich habe für NetOffice einen Twitter Account eingerichtet in dem ich Issues und Updates durchgebe. @net_office

Gelöschter Account
vor 12 Jahren

Ich habe die NetOffice Developer Toolbox um eine weiteres Feature ergänzt.

Office UI

Jeder Office Entwickler der die klassische Oberfläche in Office ergänzt oder modifiziert kennt möglicherweise das Problem das UI Elemente (unbeabsichtigt) nicht ordnungsgemäss entfernt werden. Das Ergebniss sind "UI Leichen" die persistent in Office verbleiben und die man manuell oder via Code wieder entfernen muss.
Die manuelle Entfernung ist dabei je nach Office Version garnicht mal so einfach, darum bietet die Office UI Komponente einen Weg das auf einfachem Weg zu erledigen. Als Nebeneffekt sind Manipulationen die dem Benutzer in der Form nicht offen stehen ebenfalls möglich.

Gelöschter Account
vor 12 Jahren

Ich habe gerade die finale Version des NetOffice Visual Studio Projekt Assistent online gestelt.

Verfügbar sind Assistenten für:

  • Addins
  • WindowsForms Anwendungen
  • Consolen Anwendungen
  • DynamicLinkLibrary Projekte

Sowohl C# als auch VB.NET werden unterstützt.

Bilderstrecke: Exemplarisches Beispiel für das erstellen eines neuen Addin Projekts mit dem Visual Studio Projekt Assistenten