Ich brauche einen einfachen Seriendruck in OpenOffice mit C++, VBScript, VB.Net oder C# über OLE oder native API. Gibt es gute Beispiele?Wie man einen einfachen Seriendruck in OpenOffice macht
Antwort
Ich habe nicht kommen mit einer Lösung bin ich sehr zufrieden mit, aber hier sind einige Hinweise:
Q. Was der OO-API für Seriendruck ist?
A. http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html
F. Welche Selbsthilfegruppen?
A. http://user.services.openoffice.org/en/forum/viewforum.php?f=20
Q. Beispielcode?
A. http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=946&p=3778&hilit=mail+merge#p3778
Q. Jede weitere Beispiele?
A. file: /// C: /Program%20Files/OpenOffice.org_2.4_SDK/examples/examples.html (kommt mit dem SDK)
Frage: Wie kann ich die Beispiele bauen?
A. zB für WriterDemo (C: \ Programme \ OpenOffice.org_2.4_SDK \ examples \ CLI \ VB.NET \ WriterDemo)
- Fügen Sie Verweise auf alles hier: C: \ Program Files \ OpenOffice.org 2.4 \ Programme \ assembly
- das cli_basetypes ist, cli_cppuhelper, cli_types, cli_ure
Q. Hat OO die gleiche separaten Daten-/Dokumentendatei für Seriendruck verwenden?
A. Es ist für eine Reihe von Datenquellen ermöglicht, einschließlich csv-Dateien
Q. Does OO können Sie all die verschiedenen Arten (Fax, E-Mail, neue Belegdrucker) fusionieren?
A. Sie in einem neuen Dokument, drucken fusionieren können und E-Mail
F. Können Sie benutzerdefinierte Felder hinzufügen?
A. Ja
Q. Wie erstellen Sie ein neues Dokument in VB.Net?
A.
Dim xContext As XComponentContext xContext = Bootstrap.bootstrap() Dim xFactory As XMultiServiceFactory xFactory = DirectCast(xContext.getServiceManager(), _ XMultiServiceFactory) 'Create the Desktop Dim xDesktop As unoidl.com.sun.star.frame.XDesktop xDesktop = DirectCast(xFactory.createInstance("com.sun.star.frame.Desktop"), _ unoidl.com.sun.star.frame.XDesktop) 'Open a new empty writer document Dim xComponentLoader As unoidl.com.sun.star.frame.XComponentLoader xComponentLoader = DirectCast(xDesktop, unoidl.com.sun.star.frame.XComponentLoader) Dim arProps() As unoidl.com.sun.star.beans.PropertyValue = _ New unoidl.com.sun.star.beans.PropertyValue() {} Dim xComponent As unoidl.com.sun.star.lang.XComponent xComponent = xComponentLoader.loadComponentFromURL(_ "private:factory/swriter", "_blank", 0, arProps) Dim xTextDocument As unoidl.com.sun.star.text.XTextDocument xTextDocument = DirectCast(xComponent, unoidl.com.sun.star.text.XTextDocument)
Frage: Wie Sie das Dokument speichern Sie?
A.
Dim storer As unoidl.com.sun.star.frame.XStorable = DirectCast(xTextDocument, unoidl.com.sun.star.frame.XStorable) arProps = New unoidl.com.sun.star.beans.PropertyValue() {} storer.storeToURL("file:///C:/Users/me/Desktop/OpenOffice Investigation/saved doc.odt", arProps)
Frage: Wie Öffnen Sie das Dokument?
A.
Dim xComponent As unoidl.com.sun.star.lang.XComponent xComponent = xComponentLoader.loadComponentFromURL(_ "file:///C:/Users/me/Desktop/OpenOffice Investigation/saved doc.odt", "_blank", 0, arProps)
Frage: Wie initiieren Sie einen Seriendruck in VB.Net?
A.
Weiß nicht. Diese Funktionalität befindet sich in der API-Referenz, fehlt jedoch in der IDL. Wir können leicht verdreht sein. Unter der Annahme, dass die API funktionierte, sieht es so aus, als ob das Ausführen einer Zusammenführung ziemlich einfach ist.
In VBScript:
Set objServiceManager = WScript.CreateObject ("com.sun.star.ServiceManager")
‚nun eine neue MailMerge mit den Einstellungen aus diesem Dokument extrahiert einrichten Set oMailMerge = objServiceManager.createInstance ("com.sun.star.text.MailMerge")
oMailMerge.DocumentURL = "file: /// C:/Users/me/Desktop/Openoffice Investigation/mail merged.odt" oMailMerge .DataSourceName = "fügt" hinzu oMailMerge.CommandType = 0 'http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#CommandType oMailMerge.Command = "fügt hinzu:" oMailMerge.OutputType = 2' http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#OutputType oMailMerge.execute (Array())
In VB.Net (Option Strict Off)
Dim t_OOo As Type t_OOo = Type.GetTypeFromProgID("com.sun.star.ServiceManager") Dim objServiceManager As Object objServiceManager = System.Activator.CreateInstance(t_OOo) Dim oMailMerge As Object oMailMerge = t_OOo.InvokeMember("createInstance", _ BindingFlags.InvokeMethod, Nothing, _ objServiceManager, New [Object]() {"com.sun.star.text.MailMerge"}) 'Now set up a new MailMerge using the settings extracted from that doc oMailMerge.DocumentURL = "file:///C:/Users/me/Desktop/OpenOffice Investigation/mail merged.odt" oMailMerge.DataSourceName = "adds" oMailMerge.CommandType = 0 ' http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#CommandType oMailMerge.Command = "adds" oMailMerge.OutputType = 2 ' http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#OutputType oMailMerge.execute(New [Object]() {})
das gleiche, aber mit Option Strict On (funktioniert nicht)
Dim t_OOo As Type t_OOo = Type.GetTypeFromProgID("com.sun.star.ServiceManager") Dim objServiceManager As Object objServiceManager = System.Activator.CreateInstance(t_OOo) Dim oMailMerge As Object oMailMerge = t_OOo.InvokeMember("createInstance", _ BindingFlags.InvokeMethod, Nothing, _ objServiceManager, New [Object]() {"com.sun.star.text.MailMerge"}) 'Now set up a new MailMerge using the settings extracted from that doc oMailMerge.GetType().InvokeMember("DocumentURL", BindingFlags.SetProperty, Nothing, oMailMerge, New [Object]() {"file:///C:/Users/me/Desktop/OpenOffice Investigation/mail merged.odt"}) oMailMerge.GetType().InvokeMember("DataSourceName", BindingFlags.SetProperty, Nothing, oMailMerge, New [Object]() {"adds"}) oMailMerge.GetType().InvokeMember("CommandType", BindingFlags.SetProperty, Nothing, oMailMerge, New [Object]() {0}) oMailMerge.GetType().InvokeMember("Command", BindingFlags.SetProperty, Nothing, oMailMerge, New [Object]() {"adds"}) oMailMerge.GetType().InvokeMember("OutputType", BindingFlags.SetProperty, Nothing, oMailMerge, New [Object]() {2}) oMailMerge.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod Or BindingFlags.IgnoreReturn, Nothing, oMailMerge, New [Object]() {}) ' this line fails with a type mismatch error
Sie sollten einen Blick auf Apache OpenOffice API werfen. Ein Projekt zum Erstellen einer API für Open Office. Einige Sprachen, die sie unterstützen sollen, sind: C++, Java, Python, CLI, StarBasic, JavaScript und OLE.
Verwenden Sie keine Reflektion in .NET, um eine Instanz von MailMerge zu erstellen. Ich hatte dies auch basierend auf dieser Antwort getan und während es für das Zusammenführen mit einer Datei funktionierte, konnte der Versuch, durch Festlegen der PrintOptions-Eigenschaft mit dem Drucker zusammenzuführen, mit einer variantToAny-Konvertierungsausnahme fehlschlagen. Der richtige Weg scheint die Rückgabe des getServiceManager() des Kontextes als XMultiComponentFactory zu sein, dann den Aufruf von createInstanceWithContext ("com.sun.star.text.MailMerge", Kontext), um ein MailMerge-Objekt zu erzeugen. Legen Sie das als XPropertySet fest, und legen Sie die Eigenschaften von MailMerge mit den XPropertySet-Methoden fest. – rgonet
Auch wenn Sie hier keine Spiegelung verwenden sollten, liegt es daran, dass Sie beim Übergeben des falschen Arguments die Zeile übergeben, bei der die Nichtübereinstimmung des Typkonflikts mit dem Aufruf von Execute ausgelöst wurde. Die Execute-Methode von XJob erfordert die Übergabe einer Sequenz von NamedValue-Objekten. Das bedeutet, dass Sie ein neues Objekt [] {new NamedValue [] {}} übergeben müssen und nicht nur ein neues Objekt [] {}. – rgonet