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





Вам стоит взглянуть на API Apache OpenOffice. Проект по созданию API для Open Office. Они заявили, что поддерживают несколько языков: C++, Java, Python, CLI, StarBasic, JavaScript и OLE.
Я не нашел решения, которым я действительно доволен, но вот несколько замечаний:
В. Что такое объектно-ориентированный 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
В. Еще примеры?
A. file: /// C: /Program%20Files/OpenOffice.org_2.4_SDK/examples/examples.html (поставляется с SDK)
В. Как мне построить примеры?
A. например, для WriterDemo (C: \ Program Files \ OpenOffice.org_2.4_SDK \ examples \ CLI \ VB.NET \ WriterDemo)
В. Использует ли 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?
А.
Не знаю. Эта функция есть в справочнике по API, но отсутствует в IDL. Возможно, мы слегка облажались. Если предположить, что API работает, похоже, что выполнить слияние довольно просто.
В 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 (Массив ())
В 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]() {})
То же самое, но с 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
Кроме того, хотя вы не должны использовать здесь отражение, что касается строки, генерирующей исключение несоответствия типа при вызове Execute, это связано с тем, что вы передаете неправильный аргумент. Метод XJob Execute требует передачи последовательности объектов NamedValue, что означает, что вам нужно передать новый объект [] {new NamedValue [] {}}, а не просто новый объект [] {}
Не используйте отражение в .NET для создания экземпляра MailMerge. Я тоже делал это на основе этого ответа, и хотя он работал для слияния с файлом, попытка слияния с принтером путем установки свойства PrintOptions завершилась ошибкой с исключением преобразования variantToAny. Кажется, что правильным способом является приведение возврата контекста getServiceManager () как XMultiComponentFactory, а затем вызова createInstanceWithContext ("com.sun.star.text.MailMerge", context) для создания объекта MailMerge. Приведите это как XPropertySet и установите свойства MailMerge с помощью методов XPropertySet.