Форум » [x]Harbour » Где можно взять примеры работы с OLE Open Office » Ответить

Где можно взять примеры работы с OLE Open Office

Andrey: Всем привет. В связи с борьбой с пиратами нужно переползать на открытый ОФИС. А как работать с этим OLE в хХарборе - я не знаю. Может кто-нибудь поделиться примерами ? Заранее благодарю.

Ответов - 22, стр: 1 2 All

Pasha: Неоднократно уже давал этот пример в самых разных местах Function BrwToZxc(oB) // ------------------------------------------------------------- // Экспорт обьекта Browse в OpenOffice Calc // ------------------------------------------------------------- Local oStarManager, oStarDesktop, oDocument, oSheet, oRange Local nRow := 1, nCol, nCol2, nMerge, oCol, cGrid Local acHead := {}, lFoot := .f., x, ser Local nStyle oStarManager := NewOle('com.sun.star.ServiceManager') if oStarManager # nil Begin sequence oStarDesktop := oStarManager:createInstance('com.sun.star.frame.Desktop') oDocument := oStarDesktop:LoadComponentFromURL(; 'private:factory/scalc',; '_blank',; 0,; {}) oSheet:=oDocument:Sheets:getByIndex(0) nRow := 1 for nCol := 1 TO oB:ColCount oCol := oB:GetColumn(nCol) oRange := oSheet:getCellByPosition(nCol-1, nRow-1) if ! Empty(oCol:oHeader:aTitles[nRow]) oRange:SetString(OemToAnsi(oCol:heading)) zcCellBorder(oRange, 9) endif next if nRow > 0 zcCellBorder(oSheet:getCellRangeByPosition(0,0,oB:ColCount-1,0), 8) zcCellBorder(oSheet:getCellRangeByPosition(0,nRow-1,oB:ColCount-1,nRow-1), 9) oSheet:TitleRows:StartRow := 1 oSheet:TitleRows:EndRow := nRow oSheet:PrintTitleRows := .t. endif oB:GoTop() while ! oB:HitBottom nRow++ for nCol := 1 to oB:ColCount oCol := oB:GetColumn(nCol) x := Eval(oCol:Block) if ! Empty(x) .and. ValType(x) == 'C' .and. ! Empty(Val(StrTran(x, "'", ''))) x := Val(StrTran(x, "'", '')) elseif ValType(x)=='D' x := DTOC(x) endif if oCol:cargo # nil .and. len(oCol:cargo) >= 6 .and.; ValType(oCol:cargo[6]) == 'C' .and. oCol:cargo[6] = '$' oSheet:getCellByPosition(nCol-1, nRow-1):NumberFormat := 2 endif if ! Empty(x) if ValType(x) == 'C' oSheet:getCellByPosition(nCol-1, nRow-1):SetString(x) else oSheet:getCellByPosition(nCol-1, nRow-1):SetValue(x) endif endif next oB:Down() enddo if oB:lFoots nRow++ zcCellBorder(oSheet:getCellRangeByPosition(0,nRow-1,oB:ColCount-1,nRow-1), 8) for nCol := 1 to oB:ColCount if ! Empty(oB:GetColumn(nCol):footing) x := oB:GetColumn(nCol):footing if ! Empty(Val(StrTran(x, "'", ''))) x := Val(StrTran(x, "'", '')) // elseif oB:GetColumn(nCol):nAjuste = 38 // x := Val(x) endif oSheet:getCellByPosition(nCol-1, nRow-1):SetString(x) endif next endif for nCol := 1 to oB:ColCount oSheet:getColumns():getByIndex(nCol-1):OptimalWidth := .t. next end endif Return nil Static func zcCellBorder(oRange, nNSEW) Local oBorder := oRange:TableBorder Local oLine if nNSEW == 8 oLine := oBorder:TopLine elseif nNSEW == 9 oLine := oBorder:BottomLine elseif nNSEW == 10 oLine := oBorder:RightLine elseif nNSEW == 7 oLine := oBorder:LeftLine endif oLine:OuterLineWidth := 10 oLine:InnerLineWidth := 0 if nNSEW == 8 oBorder:TopLine := oLine elseif nNSEW == 9 oBorder:BottomLine := oLine elseif nNSEW == 10 oBorder:RightLine := oLine elseif nNSEW == 7 oBorder:LeftLine := oLine endif oRange:TableBorder := oBorder Return nil

Pasha: Можно еще посмотреть архив форума http://www.oooforum.org/forum/viewforum.phtml?f=9 Там есть масса примеров Можно там задать свой вопрос

Andrey: Паша, спасибо большое.

Pasha: Не заметил, еще нужна функция: Static func NewOle(cServer) Local oServer, hObj Begin sequence hObj := CreateOleObject( cServer ) if OleError() == 0 oServer := TOleAuto():new( hObj ) #ifdef __HARBOUR__ oServer:cClassName := cServer #endif endif end if oServer == nil Alert('Ошибка инициализации OLE:' + cServer) endif Return oServer если что-то выдираешь из своей библиотеки, обязательно попадется какая-то нестандартная функция

Pasha: Вот сам наконец-то решил оседлать OO-writer, и еще маленький примерчик Задача: открыть документ и на место закладки вставить значение func OOWriter(cFile, cBookmark, cValue) Local oStarManager, oStarDesktop, oDocument Local oBookmarks, oBookmark cFile := StrTran(cFile, "\", "/") cFile := StrTran(cFile, " ", "%20") cFile := "file:///" + cFile oStarManager := NewOle('com.sun.star.ServiceManager') if oStarManager # nil Begin sequence oStarDesktop := oStarManager:createInstance('com.sun.star.frame.Desktop') oDocument := oStarDesktop:LoadComponentFromURL(; cFile,'_blank', 0, {}) oBookmarks := oDocument:getBookmarks() oBookmark := oBookmarks:GetByName(cBookmark) oBookMark:getAnchor:setString(cValue) retu nil

Andrey: Спасибо большое, Паша !!! А можно ли одновременно установить OpenOffice и MsOffice ? И как тогда это вместе будет работать ?

Dima: Andrey пишет: А можно ли одновременно установить OpenOffice и MsOffice ? Вот и пробни ;)

Andrey: Спасибо Дима за добрые пожелания...., а я то думал что сие мне делать не придется ....

Pasha: конечно можно я в своих программах в тулбаре помещаю 2 кнопки - экспорт в эксель и оо-калк если соответствующий офис установлен, работает, ну а на нет суда нет

spair2k: Добрый день уважаемые! А может кто нибудь подсказать, как узнать закончил SCalc печатать файл или нет? Просто столкнулся с проблемой во время закрытия документа с параметрами Hidden = .t., который был отправлен на печать. Может у кого ссылка есть на мануал про эту тему или просто кусочек кода завалялся??? Помогите, плиз...

spair2k: Ну соврал малость... свойства HIDDEN это было сделано на ООо Васике, в его родной среде DIM oProperty AS NEW com.sun.star.beans.PropertyValue SET oProperty.Name = "Hidden" SET oProperty.Value = True Так у меня и не получилось на xHb создать невидимый документ Может у кого получилось? подскажите пожалуйста... а по поводу предидущего сообщения нашел коечто http://www.oooforum.org/forum/viewtopic.phtml?t=4922 ... по крайней мере узнал как это делать из-под ООо Васика.

Pasha: spair2k пишет: Ну соврал малость... свойства HIDDEN это было сделано на ООо Васике, в его родной среде цитата: DIM oProperty AS NEW com.sun.star.beans.PropertyValue SET oProperty.Name = "Hidden" SET oProperty.Value = True Так у меня и не получилось на xHb создать невидимый документ Может у кого получилось? подскажите пожалуйста... oStarDesktop := oStarManager:createInstance('com.sun.star.frame.Desktop') oProperty := oServiceMamager:bridge_GetStruct("com.sun.star.beans.PropertyValue") oProperty:Name := "Hidden" oProperty:Value := .T. Return oStarDesktop:LoadComponentFromURL(; cFile, '_blank', 0, {oProperty})

Vlad04: OpenOffice уже открывается. А как открыть имеющийся файл или шаблон для заполнения?

Pasha: Vlad04 пишет: А как открыть имеющийся файл или шаблон для заполнения? oStarManager := TOleAuto():New('com.sun.star.ServiceManager') oStarDesktop := oStarManager:createInstance('com.sun.star.frame.Desktop') cFile := StrTran(cFile, "\", "/") cFile := StrTran(cFile, " ", "%20") cFile := "file:///" + cFile aProps := {} oStarDesktop:LoadComponentFromURL(; cFile, '_blank', 0, aProps)

MIKHAIL: А как можно вставить картинку в ячейку и отформатировать ячейку в размер картинки с привязкой картинки к ячейке?

MIKHAIL: как вставить картинку разобрался: oFrame:=oDocument:CurrentController:Frame dispatcher:=oStarManager:createInstance("com.sun.star.frame.DispatchHelper") arg1:=oStarDesktop:bridge_GetStruct("com.sun.star.beans.PropertyValue") arg2:=oStarDesktop:bridge_GetStruct("com.sun.star.beans.PropertyValue") arg3:=oStarDesktop:bridge_GetStruct("com.sun.star.beans.PropertyValue") arg1:Name:="FileName" arg1:Value:="file:///D:/IMAGE/24.JPG" arg2:Name:="FilterName" arg2:Value:="JPEG - Joint Photographic Experts Group" arg3:Name:="AsLink" arg3:Value:=.F. arg:={arg1,arg2,arg3} dispatcher:executeDispatch(oFrame,".uno:InsertGraphic","",0,arg) А вот отформатировать ее по размеру не получается. Может кто знает как можно это сделать?

Dima: MIKHAIL Возможно надо погуглить

MIKHAIL: После работы с документом, закрываю его oDoc:close(.t.), но Open Office висит в памяти и блокирует временные фалы. Если же закрывать приложение через oStarDesktop:terminate() то он закрывает и другие открытые документы (writer и calc ). Как корректно закрывать процесс вызванный именно работой приложения и не затрагивать остальные открытые документы ?

petr707: Когда-то нашел для себя что-то полезное на сайте https://wiki.openoffice.org/wiki/RU Есть форум http://www.forumooo.ru/

Andrey: Есть исходник 2007г. вызова Open Office на хХарборе. Работает до сих пор. Перетащил на МиниГуи - вешает задачу намертво. Подскажите пожалуйста, где ошибка ? /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= От: Логошный Сергей <?????@yandex.ru> Кому: мне Написано: 16 августа 2007 г., 9:18:59 Тема: OpenOffice. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */ FUNCTION OpenWriter(cFile) LOCAL oDoc, oApp , oDeskTop, aPr, aProp, oPr, oProperty LOCAL bLastHandler, objLocal, cMsg, FileURL FileURL:='file://localhost/'+StrTran(cFile,'\','/') /* пробовал так делать - не пошло тоже cFile := StrTran(cFile, "\", "/") cFile := StrTran(cFile, " ", "%20") FileURL:= "file://" + cFile */ MsgDebug( cFile , FileURL ) // создаём окно ожидания с потоком //WaitThreadCreate( 'Вызываю Open Office...' ) bLastHandler := ERRORBLOCK( { | objErr | MyHandler( objErr, .T.) }) BEGIN SEQUENCE oApp:= TOleAuto():new("com.sun.star.ServiceManager") RECOVER USING objLocal cMsg := "Не могу запустить - Open Office !;; (Не установлен на этом компьютере !);" MsgStop(cMsg,"Ошибка!") RETURN NIL END ERRORBLOCK( bLastHandler ) // "Запускаю - Open Office !;; (Найден на этом компьютере !);" oDeskTop:=oApp:createInstance("com.sun.star.frame.Desktop") aProp:=Array(1) aPr:=Array(1) oProperty:=oApp:Bridge_GetStruct("com.sun.star.beans.PropertyValue") oProperty:Name:= "AsTemplate" oProperty:Value:= .T. aProp[1]:=oProperty oDoc:=oDeskTop:LoadComponentFromURL(FileURL,"_blank", 0,aProp) oPr:=oApp:Bridge_GetStruct("com.sun.star.beans.PropertyValue") oPr:Name:="FilterName" oPr:Value:="Rich Text Format" aPr[1]:=oPr oDoc:storeAsURL(FileURL,aPr) //WaitThreadClose() // закрыть окно "ожидания" RETURN '' FUNCTION MyHandler (objError, lLocalHandler) IF lLocalHandler BREAK objError ENDIF RETURN NIL

MIKHAIL: Andrey пишет: "file://" у меня так "file:///"

Pasha: Хозяйке на заметку (полезные рецепты): В OpenOffice Calc пожно заполнять значения сразу диапазону ячеек, состоящему из нескольких строк. Пример (несамодостаточный): ... nRow := 10 nCol := 1 oRange := oSheet:getCellRangeByPosition(nCol-1, nRow-1, nCol+1, nRow) oRange:setDataArray({{1,2,"Example"},{4,5,"fill"}}) Причем для OO не надо создавать двумерный массив, как это требует MS Excel, а достаточно передать одномерный массив Variant, каждый элемент которого является подмассовом, как это и делает harbour hbwin



полная версия страницы