Как сделать простое слияние почты в OpenOffice

Мне нужно сделать простое слияние почты в OpenOffice, используя C++, VBScript, VB.Net или C# через OLE или собственный API. Есть ли хорошие примеры?


person 1800 INFORMATION    schedule 02.09.2008    source источник


Ответы (2)


Я не нашел решения, которым я действительно доволен, но вот несколько замечаний:

  • Вопрос. Что такое OO API для слияния?

    А. http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html

  • В. Какие группы поддержки?

    А. http://user.services.openoffice.org/en/forum/viewforum.php?f=20

  • В. Пример кода?

    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

  • В. Есть еще примеры?

    A. file:///C:/Program%20Files/OpenOffice.org_2.4_SDK/examples/examples.html (поставляется с SDK)

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

  • В. Как мне создать примеры?

    A. например, для WriterDemo (C:\Program Files\OpenOffice.org_2.4_SDK\examples\CLI\VB.NET\WriterDemo)

    1. Add references to everything in here: C:\Program Files\OpenOffice.org 2.4\program\assembly
    2. Это cli_basetypes, cli_cppuhelper, cli_types, cli_ure
  • В. Использует ли OO один и тот же отдельный файл данных/документа для слияния?

    A. Это позволяет использовать ряд источников данных, включая CSV-файлы.

  • В. Позволяет ли OO объединять все различные типы (факс, электронная почта, новый принтер документов)?

    A. Вы можете объединить в новый документ, распечатать и отправить по электронной почте

  • В. Можно ли добавить настраиваемые поля?

    А. Да

  • В. Как создать новый документ в 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)
    
  • В. Как сохранить документ?

    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)
    
  • В. Как открыть документ?

    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)
    
  • В. Как инициировать слияние почты в VB.Net?

    A.

    1. Не знаю. Эта функциональность есть в справочнике по API, но отсутствует в IDL. Мы можем быть слегка облажались. Предполагая, что API работает, запуск слияния выглядит довольно просто.

    2. В VBScript:

      Установить objServiceManager = WScript.CreateObject("com.sun.star.ServiceManager")

      'Теперь настройте новый MailMerge, используя настройки, извлеченные из этого документа. Set oMailMerge = objServiceManager.createInstance("com.sun.star.text.MailMerge")

      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(массив())

    3. В VB.Net (опция 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]() {})
      
    4. То же самое, но с Option Strict On (не работает)

          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
      
person 1800 INFORMATION    schedule 03.09.2008
comment
Не используйте отражение в .NET для создания экземпляра MailMerge. Я тоже делал это на основе этого ответа, и хотя он работал для слияния с файлом, попытка слияния с принтером путем установки свойства PrintOptions завершилась бы ошибкой с исключением преобразования variantToAny. Кажется, что правильным способом является возврат контекста getServiceManager() как XMultiComponentFactory, а затем вызов createInstanceWithContext(com.sun.star.text.MailMerge, context) для создания объекта MailMerge. Приведите это как XPPropertySet и задайте свойства MailMerge с помощью методов XPpertySet. - person rgonet; 16.12.2015
comment
Кроме того, хотя вы не должны использовать отражение здесь, в отношении строки, вызывающей исключение несоответствия типов при вызове Execute, это связано с тем, что вы передаете неправильный аргумент. Метод Execute XJob требует передачи последовательности объектов NamedValue, что означает, что вам нужно передать новый объект [] { new NamedValue [] { } }, а не просто новый объект [] { } - person rgonet; 16.12.2015

Вам следует ознакомиться с API Apache OpenOffice. Проект по созданию API для Open Office. Они сказали, что поддерживают несколько языков: C++, Java, Python, CLI, StarBasic, JavaScript и OLE.

Java Пример слияния в OpenOffice.

person Peter Stuifzand    schedule 02.09.2008