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?

¿Fue útil?

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

    http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=8088&p=38017&hilit=mail+merge#p38017

  • P.¿Algún ejemplo más?

    A.file:///C:/Program%20Files/OpenOffice.org_2.4_SDK/examples/examples.html (viene con el SDK)

    http://www.oooforum.org/forum/viewtopic.phtml?p=94970

  • P.¿Cómo construyo los ejemplos?

    A.por ejemplo, para WriterDemo (C:\Program Files\OpenOffice.org_2.4_SDK\examples\CLI\VB.NET\WriterDemo)

    1. Agregue referencias a todo lo que hay aquí:C:\Archivos de programa\OpenOffice.org 2.4\program\assembly
    2. 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.

    1. 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.

    2. 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 ())

    3. 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]() {})
      
    4. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top