使用 .net 与 Libre Office 合并邮件

Posted

技术标签:

【中文标题】使用 .net 与 Libre Office 合并邮件【英文标题】:Mail merge with Libre Office using .net 【发布时间】:2017-11-08 13:13:31 【问题描述】:

我有以下代码块,它非常适合 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 对象时出错”。 有谁知道,我该如何解决这个问题。

【问题讨论】:

我对上面的代码做了以下修改。m_xContext = uno.util.Bootstrap.bootstrap() mxMSFactory = DirectCast(m_xContext.getServiceManager(), XMultiServiceFactory) databaseContext = mxMSFactory.createInstance("com.sun.star.sdb.DatabaseContext‌​") Dim databaseNames As container.XNameAccess = DirectCast(databaseContext, container.XNameAccess) oDB = databaseNames.getByName(nameOfdDtaource) 。现在我收到运行时错误“未找到类型 'Any' 上的公共成员 'getConnection'。” 如果我更改oDB = databaseNames.getByName(nameOfdDtaource) to oDB=DirectCast(databaseNames.getByName(nameOfdDtaource),XDat‌​aSource),我会得到“'Any' 类型的值不能转换为'XDataSource'”。 【参考方案1】:

这段代码看起来不正确,所以我很惊讶它居然能奏效。在其他示例中,bootstrap() 行始终排在第一位。然后使用该服务管理器而不是单独的 oServiceManager 变量。

例如,请参阅https://www.openoffice.org/udk/common/man/spec/transparentofficecomponents.html 处的 Java 代码。

编辑

你快到了。 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)

【讨论】:

我想为 64 位 Libre Office 实现这个功能。我已经下载了包含 cli_cppuhelper Version=0.0.0.0 的 LibreOffice_5.4_SDK。当我执行时,我收到以下错误无法加载文件或程序集'cli_cppuhelper,Version=0.0.0.0,Culture=neutral,PublicKeyToken=ce2cb7e279207b9e'或其依赖项之一。试图加载格式不正确的程序。 这应该是一个新问题。请务必包含 VB.NET 和 CLR 的标签,因为我不一定是这些主题的专家。另外,请提及下载的版本细节 - SDK 和应用程序都是 64 位的吗?同时提及相关的 Visual Studio 设置。 感谢您提供信息,但我已经发布了一个问题link,在一周没有收到回复后,我想在这里添加评论,以便如果您知道的话,它会对我有很大帮助。

以上是关于使用 .net 与 Libre Office 合并邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Office VBA 与 Libre Sheet 交互

Libre Office,一个集美貌与才华于一身的软件

插入 HTML Libre Office

在 Open/Libre/Neo Office 中查找文本选择中的段落的宏

如何在 Libre/Open Office 中使用 pyUNO 库检查段落调整?

Libre Office 配置文件 bootstrap.ini 损坏