![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
подскажите как работать с автоматизацией 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(Гордое_имя_константы). Вылазит окошко с еёным значением.