Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.14;
Скачать: CL | DM;

Вниз

подскажите как работать с автоматизацией OpenOffice   Найти похожие ветки 

 
wipr   (2008-10-02 21:30) [0]

Доброе время суток мастера.
Я заинтересовался автоматизацией выгрузки данных из программы, написанной на 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.
Подскажите как можно скопировать в буфер обмена группу ячеек, а затем вставить из буфера эти ячейки в другое место на этом листе.


 
TStas ©   (2008-10-02 21:45) [1]

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


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

Что касается создания файла на основе шаблона, то предложенный вариант не поможет.
а вот по поводу капирования в буфер обмена и затем вставки я пробовал, только как это перевести в 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


 
blackman ©   (2008-10-02 22:26) [3]

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


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

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


 
blackman ©   (2008-10-03 12:06) [5]

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


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

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


 
YurikGL ©   (2008-10-04 09:07) [7]

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


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

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


 
YurikGL ©   (2008-10-05 14:37) [9]


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

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


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

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


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

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


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

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


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

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


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

Т.к. я не знаю точные вопросы на эти ответы, то постораюсь указать "рыбные места"
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"


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

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


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

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


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

Большое спасибо сссылки помогли решить 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?
на этот вопрос пока ответа не нашел


 
имя   (2009-03-24 14:05) [18]

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


 
имя   (2009-03-24 14:07) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2010.02.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
2-1260986848
Михаил Левшов
2009-12-16 21:07
2010.02.14
Как очистить все окошки редактирования на форме (TEdit)


6-1212475055
ketovchanin
2008-06-03 10:37
2010.02.14
Proxy-Authorization


15-1260203464
boriskb
2009-12-07 19:31
2010.02.14
Ищу ПО для работы с архивом изображений


15-1260382113
@!!ex
2009-12-09 21:08
2010.02.14
Подскажите советское кино с танцами.


1-1237817783
Дмитрий Белькевич
2009-03-23 17:16
2010.02.14
SHBrowseForFolder открывается пустым