Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получение доступа к таблице openOffice writer, доступ к таблице oppenoffce 
:(
    Опции темы
kven
Дата 26.7.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 5.12.2007

Репутация: 1
Всего: 1



Есть документ OpenOffice writer. Необходимо обработать в нём текст и таблицу. В таблице нужно внести данные, при необходимости добавить строки. Как получить объект unoidl.com.sun.star.text.XTextTable из документа?
А так же подскажите пожалуйсто, если есть ссылки помощи по работе с OpenOffice yf C#.
PM MAIL   Вверх
kven
Дата 28.7.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 5.12.2007

Репутация: 1
Всего: 1



Добавляю больше инофрмации
Код


// устанавливаю имя открываемого файла
DirectoryInfo dir1 = new DirectoryInfo(".");
            string stttr;
            stttr = dir1.FullName + "\\sample\\Акт уценки.odt";
            //Вызов метода bootstrap для получения нового объекта
            //ComponentContext. Если OpenOffice еще не запущен то
            //запустим его и затем возвратим ComponentContext.
            unoidl.com.sun.star.uno.XComponentContext localContext =
            uno.util.Bootstrap.bootstrap();

            //Получение нового диспетчера служб типа MultiServiceFactory,
            //мы нуждаемся в нем, чтобы получить объект desktop и создать
            //новый объект CLI.
            unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory =(unoidl.com.sun.star.lang.XMultiServiceFactory) localContext.getServiceManager();
            //Создание нового экземпляра Desktop используя наш диспетчер служб
            //Заметьте: мы передаем наш объект desktop загрузчику XComponent
            //так, чтобы мы могли загрузить или создать новые документы.
            XComponentLoader componentLoader =
            (XComponentLoader)multiServiceFactory.createInstance(
            "com.sun.star.frame.Desktop");
            //Открытие документа writer используя наш объект
            //загрузки компонентов.
            //((XLoadable)xComponent).load(PathConverter(stttr),new unoidl.com.sun.star.beans.PropertyValue[0]);
            XComponent xComponent = componentLoader.loadComponentFromURL(
            PathConverter(stttr), 
            "_blanc", 0,  
                //без дополнительных аргументов.
            new unoidl.com.sun.star.beans.PropertyValue[0]
            );
            //установка позиции в конец документа
            unoidl.com.sun.star.text.XTextRange Xrange = ((unoidl.com.sun.star.text.XTextDocument)xComponent).
            getText().getEnd();
             // вставка строки
            ((unoidl.com.sun.star.text.XTextDocument)xComponent).
            getText().insertString(Xrange, "Привет! Я - первый текст.", false);
             
            // создание обїекта для замені текста
            unoidl.com.sun.star.util.XReplaceable xReplaceable;
            xReplaceable = xComponent as unoidl.com.sun.star.util.XReplaceable;
            unoidl.com.sun.star.util.XReplaceDescriptor xRepDesc = xReplaceable.createReplaceDescriptor();
            // set a string to search for
            xRepDesc.setSearchString("_num_");
            // set the string to be inserted
            xRepDesc.setReplaceString("5434555");
            long nResult = xReplaceable.replaceAll(xRepDesc);
            
// создаём обобъект таблици правильность кода неизвестна, но компилируется
            unoidl.com.sun.star.text.XTextTable table;
// 
            table = multiServiceFactory.createInstance("unoidl.com.sun.star.text.XTextTable") as unoidl.com.sun.star.text.XTextTable;
            table = xComponent as unoidl.com.sun.star.text.XTextTable;

// после проделанных действий объект table остаётся null ссылка на объект не создаётся
// это основная проблема
            
            
            //table.initialize(4, 5);
            
           
  //После того, вносили изменения, мы передаем наш компонент
  //XStorable для сохранения его на жестком диске
            //ODT
  
       
            ((XStorable)xComponent).storeToURL(
   //Преобразование пути к файлу в формат OpenOffice
   PathConverter(stttr),
   //без дополнительных аргументов
   new unoidl.com.sun.star.beans.PropertyValue[0]);
  //Console.WriteLine("Your first OpenOffice document is saved!");
  //Console.ReadLine();
 }

        }



Возможно кто-то знает каким образом получить сссылку на объект table. Обработка таблицы вродебы уже должна будет осуществляться без проблем. 
Или есть более правильный способ, хоть какие нибуть подсказки, а дальше может у меня получится. заранее спасибо.
PM MAIL   Вверх
jonie
Дата 28.7.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



в свое время мне пришлось делат нечто подобное, правда для MSOffice, я тогда не сильно парился - написал скрипт на VBA, который мне все что нужно делал (он работал быстрее чем вызовы через RCW из .NET)..
может и вам стоит изобрести скрипт, запихать его в документ, исполнить, и выковырять скрипт из документа?) Думаю проще будет записать скрипт, нежели делать подобные не слишком красивые вызовы...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kven
Дата 29.7.2009, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 5.12.2007

Репутация: 1
Всего: 1



может быть. Но писать в любом случае для OpenOffice, Да и передача информации достаточно большая. Спасибо за совет попробую что нибуть придумать
PM MAIL   Вверх
jonie
Дата 29.7.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



у ОО есть вменяемые скрипты на питоне даже.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kven
Дата 4.8.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 5.12.2007

Репутация: 1
Всего: 1



Скрипты есть скрипты. Не всегда есть возможность работать с скриптами, и необходимость. Работа из C# c OO мне важнее. С проблемой разобрался. Оставляю код создания таблицы и добавления в неё текста, надеюсь ещё кому нибудь пригодится.

Кратко опишу как работать с OpenOffice из C#
Наверное единственный объект который можно создавать в компонентах CLI библиотек это unoidl.com.sun.star.beans.PropertyValue(), следовательно работать и создавать таблицу можно только через эти объекты. Не могу сказать со всеми ли объектами так можно работать или нет, ещё не знаю. Привожу пример для C# в котором создаётся таблица в начале документа

Код

DirectoryInfo dir1 = new DirectoryInfo(".");
            string stttr;
// имя файла
            stttr = dir1.FullName + "\\sample\\Акт уценки.odt";
            // количество строк
            int RowCount = 6;

            // количество столбцов
            int ColCount = 9;

            // стандартный запуск документа
            unoidl.com.sun.star.uno.XComponentContext localContext = uno.util.Bootstrap.bootstrap();

            // create a service factory to get shit from
            unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory = (unoidl.com.sun.star.lang.XMultiServiceFactory)localContext.getServiceManager();

            // create a component loader to get stuff from
            XComponentLoader componentLoader = (XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop");

            XComponent xComponent = componentLoader.loadComponentFromURL(
            PathConverter(stttr), //документ с URL указанный в строке
            "_blanc", 0,  //в пустом фрейме без searchflag
                //без дополнительных аргументов.
            new unoidl.com.sun.star.beans.PropertyValue[0]
            );
            // create a frame which is basically the document reference *создаём фрейм
            XFrame frame = ((unoidl.com.sun.star.text.XTextDocument)xComponent).getCurrentController().getFrame();
            
            // the tricky part, create a dispatch helper - this is the work horse *через эту компоненту происходит сама работа с таблицей
            XDispatchHelper xDispatchHelper = (XDispatchHelper)multiServiceFactory.createInstance("com.sun.star.frame.DispatchHelper");

            // this is only used if you want to set bookmark text within the table cells ... we use bookmarks as placeholders where there will be text in the future. *не проверял не нужно было
            // XNameAccess xna = ((XBookmarksSupplier)xComponent).getBookmarks();

            // массив 4 свойств. Для каждого элемента  массива необходимо выделить память (то благодаря чему заработал данный код) возможность добавления большего количества строк не нашёл ещё, заранее определяется размер таблици

            unoidl.com.sun.star.beans.PropertyValue[] tableArgs = new unoidl.com.sun.star.beans.PropertyValue[4];
            tableArgs[0] = new unoidl.com.sun.star.beans.PropertyValue();
            tableArgs[1] = new unoidl.com.sun.star.beans.PropertyValue();
            tableArgs[2] = new unoidl.com.sun.star.beans.PropertyValue();
            tableArgs[3] = new unoidl.com.sun.star.beans.PropertyValue();
            tableArgs[0].Name = "TableName";
            tableArgs[0].Value = new uno.Any("gggggg");
            tableArgs[1].Name = "Columns";
            tableArgs[1].Value =  new uno.Any(ColCount);
            tableArgs[2].Name = "Rows";  
            tableArgs[2].Value = new uno.Any( RowCount);
            tableArgs[3].Name = "Flags";
            tableArgs[3].Value = new uno.Any(9);
            // создаём свойство ячейки с параметром текста (плохо что неудобно выяснять все возможные свойства, есть книга OpenOffice для Basic можно пробовать искать там)
            unoidl.com.sun.star.beans.PropertyValue[] cellTextArgs = new unoidl.com.sun.star.beans.PropertyValue[1];
            cellTextArgs[0] = new unoidl.com.sun.star.beans.PropertyValue();
            cellTextArgs[0].Name = "Text";
            cellTextArgs[0].Value = new uno.Any("My lovely text i love you text");

            

            // dispatch the table creation event to the UI ... *вставка таблици
            xDispatchHelper.executeDispatch((XDispatchProvider)frame, ".uno:InsertTable", "", 0, tableArgs);
//вставка текста в первую ячейку
            xDispatchHelper.executeDispatch((XDispatchProvider)frame, ".uno:InsertText", "", 0, cellTextArgs);
            // you have a table in your document, the cursor is usually in the first cell of the table so you can use this function to jump between cells and insert text / bookmarks. *прыхок в следующую ячейку
            xDispatchHelper.executeDispatch((XDispatchProvider)frame, ".uno:JumpToNextCell", "", 0, new unoidl.com.sun.star.beans.PropertyValue[0]);
//вставка текста
            xDispatchHelper.executeDispatch((XDispatchProvider)frame, ".uno:InsertText", "", 0, cellTextArgs);
            //frame.

            // if you want to insert a bookmark into the cell you could try this (note you do not have to be in a table cell for this to insert a bookmark). * не проверял сслыки
            //PropertyValue[] cellBkmkArgs = new unoidl.com.sun.star.beans.PropertyValue[1];
            //cellBkmkArgs[0] = CreateNewProperty("Bookmark", new uno.Any(cell.CellBookmark));
            //xDispatchHelper.executeDispatch((XDispatchProvider)frame, ".uno:InsertBookmark", "", 0, cellBkmkArgs);



добавил некоторые свои комментарии. Если будут возникать вопросы пишите на почту или ICQ. Спасибо всем кто пытался помочь
Тему можно закрыть
PM MAIL   Вверх
kven
Дата 5.8.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 5.12.2007

Репутация: 1
Всего: 1



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.