Форум: "Основная";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];
Внизподскажите как работать с автоматизацией 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.004 c