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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
8 536
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Java-пример mailmerge в OpenOffice.

Ответ принят как подходящий

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

  • В. Что такое объектно-ориентированный 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

  • В. Образец кода?

    А. 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. Добавьте ссылки на все, что находится здесь: 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?

    А.

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

    А.

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

    А.

            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?

    А.

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

    2. В VBScript:

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

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

      oMailMerge.DocumentURL = "file: /// C: / Users / me / Desktop / OpenOffice Investigation / mail merged.odt" oMailMerge.DataSourceName = "добавляет" oMailMerge.CommandType = 0 'http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html#CommandType oMailMerge.Command = "добавляет" 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
      

Не используйте отражение в .NET для создания экземпляра MailMerge. Я тоже делал это на основе этого ответа, и хотя он работал для слияния с файлом, попытка слияния с принтером путем установки свойства PrintOptions завершилась ошибкой с исключением преобразования variantToAny. Кажется, что правильным способом является приведение возврата контекста getServiceManager () как XMultiComponentFactory, а затем вызова createInstanceWithContext ("com.sun.star.text.MailMerge", context) для создания объекта MailMerge. Приведите это как XPropertySet и установите свойства MailMerge с помощью методов XPropertySet.

rgonet 16.12.2015 04:33

Кроме того, хотя вы не должны использовать здесь отражение, что касается строки, генерирующей исключение несоответствия типа при вызове Execute, это связано с тем, что вы передаете неправильный аргумент. Метод XJob Execute требует передачи последовательности объектов NamedValue, что означает, что вам нужно передать новый объект [] {new NamedValue [] {}}, а не просто новый объект [] {}

rgonet 16.12.2015 04:40

Другие вопросы по теме