【问题标题】:How to do a simple mail merge in OpenOffice如何在 OpenOffice 中进行简单的邮件合并
【发布时间】:2010-09-07 12:28:22
【问题描述】:

我需要通过 OLE 或本机 API 使用 C++、VBScript、VB.Net 或 C# 在 OpenOffice 中进行简单的邮件合并。有什么好的例子吗?

【问题讨论】:

    标签: c# c++ com openoffice.org ole


    【解决方案1】:

    我还没有想出让我非常满意的解决方案,但这里有一些注意事项:

    • 问。邮件合并的 OO API 是什么?

      A. http://api.openoffice.org/docs/common/ref/com/sun/star/text/MailMerge.html

    • 问。有哪些支持团体?

      A. http://user.services.openoffice.org/en/forum/viewforum.php?f=20

    • 问。示例代码?

      A. 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.您可以合并到新文档、打印和发送电子邮件

    • 问。可以添加自定义字段吗?

      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 调查/邮件合并.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(Array())

      3. 在 VB.Net 中(选项严格关闭)

            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 并使用 XPropertySet 的方法设置 MailMerge 的属性。
    • 另外,虽然你不应该在这里使用反射,关于在调用 Execute 时抛出类型不匹配异常的行,这是因为你传递了错误的参数。 XJob 的 Execute 方法需要传递一系列 NamedValue 对象,这意味着您需要传递 new object[] { new NamedValue[] { } } 而不仅仅是 new object[] { }
    【解决方案2】:

    您应该看看 Apache OpenOffice API。用于为 Open Office 创建 API 的项目。他们说支持的几种语言是:C++、Java、Python、CLI、StarBasic、JavaScript 和 OLE。

    Java Example of a mailmerge in OpenOffice.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      相关资源
      最近更新 更多