2014-01-04 4 views
0

Я пытаюсь автоматизировать вычисление openoffice посредством автоматизации ole из приложения C#. Я открываю документ и сохраняю его снова. Код чаще всего загружается с веб-сайта Apache с небольшими изменениями.openoffice ole automation

private void OpenSave(string FileAddress)//format: "file:///C:/Untitled1.ods" 
    { 
     Type t_OOo= Type.GetTypeFromProgID("com.sun.star.ServiceManager"); 
     Object objServiceManager= System.Activator.CreateInstance(t_OOo); 

     // arguments for IDispatch-call 
     Object[] parameters = new Object[1]; 
     parameters[0] = "com.sun.star.frame.Desktop"; 

     // arguments for document 
     Object[] args = new Object[4]; 
     //args[0] = "private:factory/scalc"; 
     args[0] = FileAddress;   
     args[1] = "_blank"; 
     args[2] = 0; 
     args[3] = new Object[] { }; 

     Object desktop; 
     Object doc; 
     try 
     { 
      desktop = (Object)t_OOo.InvokeMember("createInstance",BindingFlags.InvokeMethod, null,objServiceManager, parameters); 
      doc = desktop.GetType().InvokeMember("loadComponentFromUrl",BindingFlags.InvokeMethod, null, desktop, args); 

      if (doc == null) 
      {/*Error*/ } 

      object[] O = new object[3]; 
      O[0] = FileAddress; 
      O[1] = new PropertyValue(); 
      ((PropertyValue)O[1]).Name = ""; 
      ((PropertyValue)O[1]).Value = true; 
      O[2] = new Object[] { }; 

      desktop.GetType().InvokeMember("storeAsURL", BindingFlags.InvokeMethod, null, desktop,O);    
     } 
     catch (Exception e1) 
     { 
      Console.WriteLine(e1); 
     } 

Последняя строка кода (saveTOURL) всегда выдает исключение "Неизвестное имя" (точное исключение:. [System.Runtime.InteropServices.COMException] = { "Неизвестное имя (Исключение из HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) "}). Может кто-нибудь помочь? Пожалуйста, обратите внимание, что я в основном открываю файлы xls с помощью этой программы.

Фактически документация о C# & OLE недостаточно богата. Вся документация находится на Java, и мне пришлось сравнивать Java с несколькими олевыми выборками, чтобы найти слабый ключ к объектной модели.

Я хочу, чтобы иметь возможность изменить значение ячейки перед сохранением, я был бы признателен, если бы вы могли мне также рассказать об этом.

+0

В отличие от сайтов форума, мы не используем «Спасибо» или «Любая помощь приветствуется», или подписи на [так] , См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+0

Хорошо, такие люди, как я, которые редко публикуют здесь, могут через некоторое время забыть этот код поведения, потому что он не похож на обычный этикет, я постараюсь его запомнить. –

+0

Я надеялся, что кто-нибудь поможет здесь. Является ли приемлемым, если я прямо спрашиваю человека, который ответил на подобный вопрос, чтобы взглянуть на мою проблему? –

ответ

0

Я решил проблему с помощью C# SDK вместо OLE, так что это не совсем ответ на вопрос об OLE.

Я рекомендую использовать SDK, потому что вы можете воспользоваться предопределенной объектной моделью официального API, в то время как в com interop нет такого руководства.

Вы должны Openoffice SDK установлен в вашей системе, то в вашей C# проекта добавить ссылку на все DLLки в этом каталоге:

... \ OpenOffice 4 \ SDK \ кли \ cli_basetypes.dll

Эти страницы имеют практические примеры использования API-интерфейсы из C#:

http://suite101.com/a/creating-an-openoffice-calc-document-with-c-a124112 (404) http://www.oooforum.org/forum/viewtopic.phtml?t=107055

Смежные вопросы