Слияние почты с Libre Office с использованием.net
У меня есть следующий блок кода, который отлично работает для OpenOffice SDK для автоматизации функции слияния почты.
Public Function runQueryOnDataSource(ByVal nameOfdDtaource As String, ByVal query As String) As Boolean
strLog = strLog + vbCrLf + Now.ToString() + ": runQueryOnDataSource nameOfdDtaource:" + nameOfdDtaource + ",query:" + query + "-Started"
Dim oDB As Object, oBase As Object
Dim oStatement As Object
Dim rSQL As String
Dim oRequete As Object
Dim oServiceManager As Object, CreateUnoService As Object
Try
'Creation instance Open office
oServiceManager = CreateObject("com.sun.star.ServiceManager")
CreateUnoService = oServiceManager.createInstance("com.sun.star.sdb.DatabaseContext")
mxMSFactory = (uno.util.Bootstrap.bootstrap()).getServiceManager()
oDB = CreateUnoService.getByName(nameOfdDtaource) 'oDB=XDataSource
'Connection
oBase = oDB.getConnection("", "") 'oBase=XConnection
oStatement = oBase.createStatement 'XStatement
'rSQL = "SELECT * FROM ""26_MailMergeResult_DEMO"
rSQL = query
oRequete = oStatement.execute(rSQL)
Return True
Catch ex As Exception
strLog = strLog + vbCrLf + Now.ToString() + ": Exception" + ex.ToString()
Throw ex
Finally
oDB = Nothing
oBase.Close()
oBase.Dispose()
End Try
strLog = strLog + vbCrLf + Now.ToString() + ": runQueryOnDataSource-Finished"
Return True
End Function
Вышеуказанный код используется для вставки данных в источник данных, уже зарегистрированный в libre office. Но теперь, когда я пытаюсь его использовать, строка oServiceManager = CreateObject("com.sun.star.ServiceManager")
выдает ошибку "Ошибка при создании объекта ActiveX". У кого-нибудь есть идеи, как мне это исправить.
1 ответ
Этот код выглядит неправильно, поэтому я удивлен, что он когда-либо работал. В других примерах bootstrap()
линия всегда идет первой. Затем используйте этот менеджер служб вместо отдельного oServiceManager
переменная.
Например, см. Код Java по адресу https://www.openoffice.org/udk/common/man/spec/transparentofficecomponents.html.
РЕДАКТИРОВАТЬ:
Ты почти там. getByName()
метод возвращает uno.Any, свойство которого называется Value
тот DirectCast
можешь использовать.
Dim oDB As XDataSource
Dim oBase As XConnection = Nothing
Dim xContext As XComponentContext = uno.util.Bootstrap.bootstrap()
Dim xMSFactory As XMultiServiceFactory = DirectCast(
xContext.getServiceManager(), XMultiServiceFactory)
Dim xNameAccess As XNameAccess = DirectCast(
xMSFactory.createInstance("com.sun.star.sdb.DatabaseContext"), XNameAccess)
oDB = DirectCast(xNameAccess.getByName("Bibliography").Value, XDataSource)
oBase = DirectCast(oDB.getConnection("", ""), XConnection)