Приведение исключения при использовании OpenOffice SDK для создания источника данных

У меня есть приложение C#, которое выполняет слияния почты с MS Office (используя Interop API). Я сейчас пытаюсь сделать так, чтобы он поддерживал Open office. Я хочу использовать OpenOffice SDK: http://www.openoffice.org/api/docs/common/ref/com/sun/star/text/MailMerge.html

Не выглядит кристально чистой для меня прямо сейчас....

Мне как-то удалось заставить код слияния работать. Дело в том, что нам нужно создать "источник данных" перед тем, как на самом деле выполнять MailMerge, и я сталкиваюсь с трудностями при этом.

Я могу получить образец на 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 store = (XStorable) xDs; // (XStorable) UnoRuntime.queryInterface (XStorable.class, xDs);

->

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

Есть ли способ правильно преобразовать этот код в C#?

В противном случае, знаете ли вы какой-либо другой ресурс, показывающий, как создать Open Office DataSource в Java?

Спасибо

1 ответ

Сначала я попытался использовать C# и столкнулся с той же ошибкой, которую вы описали.

Затем я попробовал пример с использованием Java и в итоге получил нулевое значение для XStorable. Поэтому я думаю, что ваша проблема не в C#, а в том, что по какой-то причине пустой источник данных не создается должным образом.

В разделе Создание текстового источника данных libreoffice и установка параметров с помощью java, похоже, что плакат успешно завершен, поэтому я не уверен, что пошло не так, когда я его попробовал.

Этот код для печати источников данных действительно работает для меня: https://wiki.openoffice.org/wiki/Documentation/DevGuide/Database/Data_Sources_in_OpenOffice.org_API.

Другие вопросы по тегам