Cómo hacer una combinación de correspondencia simple en OpenOffice
-
09-06-2019 - |
Pregunta
Necesito hacer una combinación de correspondencia simple en OpenOffice usando C++, VBScript, VB.Net o C# a través de OLE o API nativa.¿Hay buenos ejemplos disponibles?
Solución
No se me ocurrió una solución con la que esté realmente satisfecho, pero aquí hay algunas notas:
P.¿Qué es la API OO para combinación de correspondencia?
A. http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html
P.¿Qué grupos de apoyo?
A. http://user.services.openoffice.org/en/forum/viewforum.php?f=20
P.¿Código de muestra?
A. http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=946&p=3778&hilit=mail+merge#p3778
P.¿Algún ejemplo más?
A.file:///C:/Program%20Files/OpenOffice.org_2.4_SDK/examples/examples.html (viene con el SDK)
P.¿Cómo construyo los ejemplos?
A.por ejemplo, para WriterDemo (C:\Program Files\OpenOffice.org_2.4_SDK\examples\CLI\VB.NET\WriterDemo)
- Agregue referencias a todo lo que hay aquí:C:\Archivos de programa\OpenOffice.org 2.4\program\assembly
- Eso es cli_basetypes, cli_cppuhelper, cli_types, cli_ure
P.¿OO utiliza el mismo archivo de datos/documento independiente para la combinación de correspondencia?
A.Permite una variedad de fuentes de datos, incluidos archivos csv.
P.¿OO le permite fusionar todos los diferentes tipos (fax, correo electrónico, impresora de nuevos documentos)?
A.Puede fusionarlo en un nuevo documento, imprimirlo y enviarlo por correo electrónico.
P.¿Puedes agregar campos personalizados?
A.Sí
P.¿Cómo se crea un nuevo documento en 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)
P.¿Cómo se guarda el documento?
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)
P.¿Cómo se abre el documento?
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)
P.¿Cómo se inicia una combinación de correspondencia en VB.Net?
A.
No lo sé.Esta funcionalidad está en la referencia de API pero falta en IDL.Puede que estemos un poco jodidos.Suponiendo que la API estuviera funcionando, parece que ejecutar una combinación es bastante simple.
En VBScript:
Establecer objServiceManager = WScript.CreateObject("com.sun.star.ServiceManager")
'Ahora configure un nuevo Mailmerge utilizando la configuración extraída de ese Doc set Omailmerge = objserviceManager.CreateInstance ("com.sun.star.text.mailmerge")
omailmerge.documentUrl = "archivo: /// c:/users/me/escritorio/abrefice investigación/mail fused.odt" omailmerge.datasourcename = "agrega" omailmerge.commandType = 0 ' http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#CommandTypeomailmerge.command = "agrega" omailmerge.outputType = 2 ' http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#OutputTypeoMailMerge.execute (matriz ())
En VB.Net (opción estrictamente desactivada)
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]() {})
Lo mismo pero con Option Strict On (no funciona)
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
Otros consejos
Deberías echar un vistazo a API de Apache OpenOffice.Un proyecto para crear una API para Open Office.Algunos idiomas que dijeron admitir son:C++, Java, Python, CLI, StarBasic, JavaScript y OLE.
Ejemplo Java de combinación de correspondencia en OpenOffice.