Слияние почты с 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)
Другие вопросы по тегам