Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

подскажите как работать с автоматизацией OpenOffice [D7, WinXP]


wipr ©   (2008-10-02 21:30:00) 

Доброе время суток мастера.
Я заинтересовался автоматизацией выгрузки данных из программы, написанной на Delphi в OpenOffice.

Вопрос 1.
С созданием с пустой таблицы и открытием существующей таблицы все понятно, у меня все это получилось, а вот создание нового файла на основе шаблона MS Excel я не знаю как.
 Создание пустой таблицы:
 OO := CreateOleObject('com.sun.star.ServiceManager');
 Desktop := OO.createInstance('com.sun.star.frame.Desktop');
 Document := Desktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, VarArrayCreate([0, -1], varVariant));
 Открытие существующего файла:
 OO := CreateOleObject('com.sun.star.ServiceManager');
 Desktop := OO.createInstance('com.sun.star.frame.Desktop');
 Document := Desktop.LoadComponentFromURL('file:///d:\prob.xls', '_blank', 0, VarArrayCreate([0, -1], varVariant));
Подскажите если кто знает как создать новый файл на основе шаблона MS Excel (без сохранения файла на диске).

Вопрос 2.
Подскажите как можно скопировать в буфер обмена группу ячеек, а затем вставить из буфера эти ячейки в другое место на этом листе.


  (2009-03-24 14:07:00) [1]

Удалено модератором


  (2009-03-24 14:05:00) [2]

Удалено модератором


wipr   (2008-10-13 21:26:00) [3]

Большое спасибо сссылки помогли решить 2 из трех проблем, дам ответ, может кому будет интересно:
1) Как можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место?
ответ.
procedure TfrmMane.Button9Click(Sender: TObject);
var
 OO, Document, Desktop, OODispatcher: Variant;
 ooParams, ooFrame: Variant;
begin
 OO := CreateOleObject('com.sun.star.ServiceManager');
 Desktop := OO.CreateInstance('com.sun.star.frame.Desktop');
 Document := Desktop.LoadComponentFromURL('file:///d:\prob.xls', '_blank', 0, VarArrayCreate([0, -1], varVariant));
 OODispatcher := OO.createInstance('com.sun.star.frame.DispatchHelper');
 ooFrame:=Document.getCurrentController.getFrame;

 ooParams:= VarArrayCreate([0, 0], varVariant);
 ooParams[0]:= OO.Bridge_GetStruct('com.sun.star.beans.PropertyValue');

 ooParams[0].name := 'ToPoint';
 ooParams[0].value := '$A$1:$B$3';
 ooDispatcher.executeDispatch(ooFrame, '.uno:GoToCell', '', 0, ooParams);
 ooDispatcher.executeDispatch(ooFrame, '.uno:Copy', '', 0, ooParams);

 ooParams[0].name := 'ToPoint';
 ooParams[0].value := '$A$5';
 ooDispatcher.executeDispatch(ooFrame, '.uno:GoToCell', '', 0, ooParams);
 ooDispatcher.executeDispatch(ooFrame, '.uno:Paste', '', 0, ooParams);
end;

2) Как можно вставить новую строку между двумя существующими?
ответ.
procedure TfrmMane.Button17Click(Sender: TObject);
var
 OO, Document, Desktop, OODispatcher: Variant;
 ooParams, ooFrame: Variant;
begin
 OO := CreateOleObject('com.sun.star.ServiceManager');
 Desktop := OO.CreateInstance('com.sun.star.frame.Desktop');
 Document := Desktop.LoadComponentFromURL('file:///d:\prob.xls', '_blank', 0, VarArrayCreate([0, -1], varVariant));
 OODispatcher := OO.createInstance('com.sun.star.frame.DispatchHelper');
 ooFrame:=Document.getCurrentController.getFrame;
 ooParams:= VarArrayCreate([0, 0], varVariant);
 ooParams[0]:= OO.Bridge_GetStruct('com.sun.star.beans.PropertyValue');

 ooParams[0].name := 'ToPoint';
 ooParams[0].value := '$A$2';
 ooDispatcher.executeDispatch(ooFrame, '.uno:GoToCell', '', 0, ooParams);
 //после установки курсора вставляем строку перед курсором
 ooDispatcher.executeDispatch(ooFrame, '.uno:InsertRows', '', 0, ooParams);
end;

3) Как создать новый файл на основе шаблона MS Excel?
на этот вопрос пока ответа не нашел


Наиль   (2008-10-11 19:44:00) [4]

Ещё одна ссылка.
Форум на которум успели обсудить практически все проблемы скрещивания OOffica и Delphi
http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=405083&pg=-1#


Наиль   (2008-10-11 13:47:00) [5]

И вот ещё.
Место тусовки авторов обёртки: http://www.freepascal.ru/forum/viewtopic.php?f=6&t=2585


Наиль   (2008-10-11 13:40:00) [6]

Т.к. я не знаю точные вопросы на эти ответы, то постораюсь указать "рыбные места"
1. Самый ценый источник - это делфи- (вернее паскаль-)обёртка вокруг автоматизации ОpОfОrg http://uno-pas-bridge.sourceforge.net/pre-release.php
2. Самый понятный, и думаю уже изученый вами: http://www.delphimaster.ru/articles/openoffice/index.html
3. Форум разработчиков ОколоОпенОфис программ: http://www.oooforum.org/forum/viewforum.phtml?f=11
Особое внимание стоит обратить на файл OO_Names.pas из первой ссылки.
В нём перечислены все комманды OpenOffice
К примеру к вашему вопросу близки такие комманды:
'com.sun.star.sheet.XCellRangeMovement'
'com.sun.star.sheet.CellInsertMode'


wipr   (2008-10-09 20:30:00) [7]

AutomateIt открывает Open Office Calk, но те операции котрые я выполняю с Excel, он не поддерживает, выдается ошибка. Мне необходимо узнать
1) Как можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место?
2) Как можно вставить новую строку между двумя существующими?
3) Как создать новый файл на основе шаблона MS Excel?


Наиль   (2008-10-08 19:39:00) [8]

Возможно стоит воспользовать AutomateIt, он позволяет писать единый код для обоих офисов. С учётом наличия исходного кода, возможно найдутся ответы и на твои вопросы.
http://sourceforge.net/projects/automateit/


wipr   (2008-10-06 19:45:00) [9]

Для меня важнее всего узнать как можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место. Так же хотелось знать как можно вставить новую строку между двумя существующими.
Переименовывать и сохранять в temp шаблон меня не устраивает по нескольким причинам.


blackman   (2008-10-05 19:27:00) [10]

wipr   (05.10.08 09:20) [8]
Как пользователь испортит, если ты его переименовал и записал в темп?
Он уже не имеет доступа к первоначальному шаблону.


YurikGL   (2008-10-05 14:37:00) [11]


> Если с созданием на основе шаблона еще можно выкрутится,
>  например шаблоны разместить в сети с доступом только на
> чтение, то их случайно пользователи не смогет испортить

Именно с шаблоном и надо делать. Только подгружать его лучше из базы (если, конечно, с базой данных работаешь).


wipr   (2008-10-05 09:20:00) [12]

Это подойдет если отчет имеет один набор данных, если это отношение один ко многим, с разным форматированием, шахматка, или этикетки, которые множатся как в сторону, так и в низ, то подготовка xml не упростит задачу, а скорее усложнит.
Если с созданием на основе шаблона еще можно выкрутится, например шаблоны разместить в сети с доступом только на чтение, то их случайно пользователи не смогет испортить. Но мне важнее всего узнать ка можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место. Так же хотелось знать как можно вставить новую строку между двумя существующими.


YurikGL   (2008-10-04 09:07:00) [13]

Создавай XML-документ и открывай его тем, что установлено на компьютере. Будет работать и с опенофисом и с МСофисом.


wipr   (2008-10-03 20:45:00) [14]

Если я не собираюсь его сохранять, то зачем его сохранять в TEMP, к тому же бывает необходимо сделать на основе одного отчета несколько, например с разными периодами и проанализировать их, если сохранять в темпе, то второй отчет не создашь из за того, что открыт будет первый, если на каждый отчет давать уникальное имя отчета, то будет много мусора собираться, идеально если как в MS Excel будет создаваться новый файл каждый раз без сохранения на диске.


blackman   (2008-10-03 12:06:00) [15]

Открой шаблон и сохрани с новым именем хотя бы в temp.
Зачем вообще создавать, если ты его не собираешься сохранять?


wipr   (2008-10-02 22:31:00) [16]

с этой статьей я знаком, в ней нет ответов на мой вопрос


blackman   (2008-10-02 22:26:00) [17]

Первые шаги в автоматизации OpenOffice.Calc и OpenOffice.Writer под Delphi
http://articles.org.ru/cn/showdetail.php?cid=6064


wipr   (2008-10-02 21:59:00) [18]

Что касается создания файла на основе шаблона, то предложенный вариант не поможет.
а вот по поводу капирования в буфер обмена и затем вставки я пробовал, только как это перевести в Delphi не понятно
пример
sub Macro1
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$D$4"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$D$7"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "SelectedFormat"
args4(0).Value = 1

dispatcher.executeDispatch(document, ".uno:ClipboardFormatItems", "", 0, args4())

end sub


TStas   (2008-10-02 21:45:00) [19]

Также, как и любые другие действия с сервером автоматизации: пишешь экселевский макрос мышкой, а потом смотришь, что именно написалось. Единственно что, иногда некотороые вещи, например стили рамок в экселе, макрос пишется, а из Дельфей не получается, т. к. не поддерживается. Константы экселевские и вордовские узнаются очень просто: вставляешь в макрос MsgBox(Гордое_имя_константы). Вылазит окошко с еёным значением.


Наверх

Титульная страница Поиск, карта сайта Написать письмо