使用 OpenOffice SDK 创建数据源时抛出异常

Posted

技术标签:

【中文标题】使用 OpenOffice SDK 创建数据源时抛出异常【英文标题】:cast exception while using OpenOffice SDK to create a DataSource 【发布时间】:2016-12-29 16:15:57 【问题描述】:

我有一个使用 MS Office 执行邮件合并的 C# 应用程序(使用互操作 API)。 我现在正试图让它支持开放式办公室。 我想使用 OpenOffice SDK: http://www.openoffice.org/api/docs/common/ref/com/sun/star/text/MailMerge.html#Command

我现在看起来不是很清楚......

我设法让邮件合并代码工作。 问题是我们需要在实际执行 MailMerge 之前创建一个“DataSource”,而我遇到了困难。

我可以在这里获取 Java 示例: https://wiki.openoffice.org/wiki/Documentation/DevGuide/Database/The_DataSource_Service

我需要把它转换成 C#。

我的困难在于 Java 使用这个对象来执行它的转换:

XStorable store = ( XStorable)UnoRuntime.queryInterface(XStorable.class, xDs);

C# 中没有等价物。

我是这样转换代码的:

  public static void CreateDataSource(string dataSourceProvidedFilePath, string dataSourceSavedFilePath)
    
                XComponentContext oStrap = uno.util.Bootstrap.bootstrap();
        XMultiServiceFactory _rMSF = (XMultiServiceFactory)oStrap.getServiceManager();

         // the XSingleServiceFactory of the database context creates new generic 
      // com.sun.star.sdb.DataSources (!)
      // retrieve the database context at the global service manager and get its 
      // XSingleServiceFactory interface
      XSingleServiceFactory xFac = (XSingleServiceFactory) _rMSF.createInstance("com.sun.star.sdb.DatabaseContext");
          //(XSingleServiceFactory)UnoRuntime.queryInterface(XSingleServiceFactory.class, _rMSF.createInstance("com.sun.star.sdb.DatabaseContext"));

      // instantiate an empty data source at the XSingleServiceFactory 
      // interface of the DatabaseContext
      Object xDs = xFac.createInstance();

      // register it with the database context
      XNamingService xServ = (XNamingService)xFac;
          //(XNamingService)UnoRuntime.queryInterface(XNamingService.class, xFac);

      XStorable store = ( XStorable) xDs;
          //( XStorable)UnoRuntime.queryInterface(XStorable.class, xDs);

      XModel model =( XModel) xDs;
          //( XModel)UnoRuntime.queryInterface(XModel.class, xDs);

        //on détermine le fichier ou sera sauvegardée la data source
      string dataSourcePathURL = Path.Combine(Path.GetDirectoryName(dataSourceProvidedFilePath), dataSourceSavedFilePath + ".odb").ConvertToOpenOfficeURL();
      store.storeAsURL(/*"file:///c:/test.odb"*/dataSourcePathURL,model.getArgs());
      xServ.registerObject("NewDataSourceName", xDs);

      // setting the necessary data source properties
      XPropertySet xDsProps = (XPropertySet)xDs;
          //(XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xDs);
      // Adabas D URL
      xDsProps.setPropertyValue("URL", new uno.Any("sdbc:adabas::MYDB1"));

      // force password dialog
      //xDsProps.setPropertyValue("IsPasswordRequired", new Boolean(true));

      // suggest dsadmin as user name
      xDsProps.setPropertyValue("User", new uno.Any("dsadmin"));
      store.store();
    

一些演员工作正常:

XNamingService xServ = (XNamingService)xFac;
          //(XNamingService)UnoRuntime.queryInterface(XNamingService.class, xFac);

但其他一些强制转换抛出异常:

XStorable 存储 = (XStorable) xDs; //(XStorable)UnoRuntime.queryInterface(XStorable.class, xDs);

->

Unable to cast transparent proxy to type 'unoidl.com.sun.star.frame.XStorable'.

有没有办法将此代码正确转换为 C#?

否则,您是否知道任何其他展示如何在 Java 中创建 Open Office 数据源的资源?

谢谢

【问题讨论】:

【参考方案1】:

首先我尝试使用 C# 并遇到了与您描述的相同的错误。

然后我尝试了使用 Java 的示例,结果 XStorable 的值为空。所以我认为你的问题不是由于 C#,而是因为由于某种原因没有正确创建空数据源。

在Create a libreoffice text-based datasource and set settings with java,发帖好像成功了,所以我试了下不知道哪里出了问题。

这个打印数据源的代码对我有用:https://wiki.openoffice.org/wiki/Documentation/DevGuide/Database/Data_Sources_in_OpenOffice.org_API。

【讨论】:

以上是关于使用 OpenOffice SDK 创建数据源时抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

openoffice writer java sdk替换writer文档中的文本

使用 @stripe/stripe-react-native 处理 Stripe 时抛出错误

使用 OpenOffice 3 示例代码的“Hello World”

使用 HSQLDB 比较 Openoffice 数据库中的日期

JDBC - 从 OpenOffice 数据库中获取所有表名

GCDAsyncUdpSocket接收数据时抛出malloc错误