автоматизация openoffice

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

    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-файлы с помощью этой программы.

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

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


person Alireza Ahmadi Rad    schedule 04.01.2014    source источник
comment
В отличие от форумов, мы не используем слова «Спасибо» или «Любая помощь приветствуется» или подписи на Stack Overflow. См. раздел Должен ли быть "Привет", "спасибо" слоганов и приветствий удалить из постов?.   -  person John Saunders    schedule 04.01.2014
comment
Ладно, такие люди, как я, которые редко пишут здесь, могут через некоторое время забыть этот кодекс поведения, потому что он не похож на обычный этикет, я постараюсь запомнить его.   -  person Alireza Ahmadi Rad    schedule 05.01.2014
comment
Я надеялся, что здесь кто-нибудь поможет. Допустимо ли, если я напрямую попрошу человека, который ответил на аналогичный вопрос, взглянуть на мою проблему?   -  person Alireza Ahmadi Rad    schedule 08.01.2014
comment
Нет, это неприемлемо. Вы должны предположить, что эти люди видели ваш вопрос и решили не отвечать на него. Одной из причин может быть то, что вы не предоставили нам полное исключение. Пожалуйста, добавьте его к вашему вопросу.   -  person John Saunders    schedule 08.01.2014


Ответы (1)


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

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

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

...\OpenOffice 4\sdk\cli\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

person Alireza Ahmadi Rad    schedule 12.01.2014
comment
Ссылки мертвы, как и следовало ожидать. Теперь было бы неплохо увидеть несколько строк примера кода. - person TaW; 05.06.2018