Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.018 c
15-1260221418
Юрий
2009-12-08 00:30
2010.02.14
С днем рождения ! 8 декабря 2009 вторник


1-1237195269
man Yury
2009-03-16 12:21
2010.02.14
Ошибка 32 при вызове TFileStream


2-1260795180
ShowMessage
2009-12-14 15:53
2010.02.14
Координаты ShowMessage на форме


2-1260824299
andrewtitoff
2009-12-14 23:58
2010.02.14
MySQL


8-1202830269
nuflin
2008-02-12 18:31
2010.02.14
OPENGL VBO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский