вставить объект, содержащий, форматированный текст в закладку

Автор DrunkWolf, 9 августа 2012, 12:20

0 Пользователи и 1 гость просматривают эту тему.

DrunkWolf

Помогите разобраться. Пишу скрипт на VBS
Задача вставить объект, содержащий, форматированный текст из одного файла в закладку, находящуюся в другом файле, через OOo Writer.
Какой метод для этого использовать? insertTextContent, insertString, getString?

Yakov


DrunkWolf


'
'Creates a sequence of com.sun.star.beans.PropertyValue s
'
Function MakePropertyValue(cName, uValue)' As Object
Dim oStruct, oServiceManager 'as Object
    Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    oStruct.Name = cName
    oStruct.Value = uValue
    Set MakePropertyValue = oStruct
End Function

'Converts a Ms Windows local pathname in URL (RFC 1738)
'Todo : UNC pathnames, more character conversions
'
Function ConvertToUrl(strFile) 'As String
    strFile = Replace(strFile, "\", "/")
    strFile = Replace(strFile, ":", "|")
    strFile = Replace(strFile, " ", "%20")
    strFile = "file:///" + strFile
    ConvertToUrl = strFile
End Function
'A simple shortcut to create a service
'
Public Function CreateUnoService(strServiceName)' As Object
Dim oServiceManager 'As Object
    Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set CreateUnoService = oServiceManager.createInstance(strServiceName)
End Function

Function openDoc(sFile)
Rem
Rem Load an existing writer document, with opening parameters
Rem
  Dim oSM, ODesk 'as Object 'root object from OOo API
  Dim oDoc 'as Object       'The document to be opened
  Dim OpenPar(1) 'As Object 'a Visual Basic array, with 3 elements
'sFile ="C:\oo\11.doc"
sFileURL = ConvertToUrl(sFile)
'Instanciate OOo : the first line is always required from Visual Basic for OOo
  Set oSM = CreateObject("com.sun.star.ServiceManager")
  Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

'We call the MakePropertyValue function, defined just before, to access the structure
  Set OpenPar(0) = MakePropertyValue("ReadOnly", False)
' Set OpenPar(1) = MakePropertyValue("Password", "secret")
  Set OpenPar(1) = MakePropertyValue("Hidden", False)

'Now we can call the OOo loadComponentFromURL method, giving it as
'fourth argument the result of our precedent MakePropertyValue call   
  Set oDoc = oDesk.loadComponentFromURL(sFileURL, "_blank", 0, OpenPar)
  set openDoc = oDoc

     
End Function
'''''''''''''''
sFile ="C:\oo\11.doc"
sFile2 ="C:\oo\22.doc"
set oDoc = openDoc(sFile)  ' открываем файл в который вставить
set oDoc2 = openDoc(sFile2) ' файл, содержащий текст вставки
Flag=True
set TextPointer = oDoc.GetText
set CursorPointer = TextPointer.CreateTextCursor
set BookmarksSupplier=oDoc.getBookmarks
set Bookmark=BookmarksSupplier.getByName("Zakl").getAnchor
' set hh =  TextPointer.getString
Text = "hhhhhhhh"
Bookmark.setString(Text)  ' работает

  TextPointer.insertString Bookmark, Text, false   '  работает   


DrunkWolf

Последние две функции вставляют обычный текст в виде строки. А мне, как я думаю, нужен объект с текстом.


Yakov

Идея этого макроса - воспользоваться буфером обмена офиса

DrunkWolf

Очень тяжело понять этот код. Может есть какая-то функция в самом OOo? insertTextContent например?

Hasim


Yakov

Вот пример на StarBasic
(как это работает на VBS посмотрю попозже)


sub Macro2
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DeSelect", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoDownSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoDownSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:goDown", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:goDown", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub


http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_3.x_Commands    - список uno команд
(т.е. команд вида  dispatcher.executeDispatch(document, ".uno:User_uno_Command", "", 0, Array())    )

DrunkWolf

#9
Да так работает, но мне то ведь нужно вставить именно в закладку, а не просто скопировать текст.

Yakov

Ещё один пример на StarBasic
Этот код просматривает стили документа в текущем параграфе, размер шрифта и название шрифта.
Выводит это на экран. Увеличивает размер шрифта на 1. И дополняет текст строкой "+новый текст"


Sub PrintAllParagraphStyles
  Dim s As String
  Dim vCurCursor As Variant
  Dim vText As Variant
  Dim sCurStyle As String


  vText = ThisComponent.Text
  vCurCursor = vText.CreateTextCursor()
  vCurCursor.GoToStart(False)
  Do
    If NOT vCurCursor.gotoEndOfParagraph( True ) Then Exit Do

    sCurStyle = vCurCursor.ParaStyleName
    CharHeight = vCurCursor.GetPropertyValue("CharHeight")
    CharFontName = vCurCursor.GetPropertyValue("CharFontName")
    s = s & """" & sCurStyle & """" & "  "  & """" &  CharHeight & """" &  "  "  & """" &  CharFontName & """" &CHR$(10)
   
     vCurCursor.SetPropertyValue("CharHeight", CharHeight+1)
     vCurCursor.SetPropertyValue("CharFontName", "Arial")
     Rem Вставить текст
     vText.InsertString(vCurCursor, "+новый текст", FALSE)
     Rem Вставить символ завершения строки
     vText.InsertControlCharacter(vCurCursor, 0, FALSE)
 
  Loop Until NOT vCurCursor.gotoNextParagraph( False )
  MsgBox s, 0, "Styles in Document"


Yakov

А вот пример на VBS

'
'Creates a sequence of com.sun.star.beans.PropertyValue s
'
Function MakePropertyValue(cName, uValue)' As Object
Dim oStruct, oServiceManager 'as Object
    Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    oStruct.Name = cName
    oStruct.Value = uValue
    Set MakePropertyValue = oStruct
End Function

'Converts a Ms Windows local pathname in URL (RFC 1738)
'Todo : UNC pathnames, more character conversions
'
Function ConvertToUrl(strFile) 'As String
    strFile = Replace(strFile, "\", "/")
    strFile = Replace(strFile, ":", "|")
    strFile = Replace(strFile, " ", "%20")
    strFile = "file:///" + strFile
    ConvertToUrl = strFile
End Function
'A simple shortcut to create a service
'
Public Function CreateUnoService(strServiceName)' As Object
Dim oServiceManager 'As Object
    Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set CreateUnoService = oServiceManager.createInstance(strServiceName)
End Function

Function openDoc(sFile)
Rem
Rem Load an existing writer document, with opening parameters
Rem
  Dim oSM, ODesk 'as Object 'root object from OOo API
  Dim oDoc 'as Object       'The document to be opened
  Dim OpenPar(1) 'As Object 'a Visual Basic array, with 3 elements
'sFile ="C:\oo\11.doc"
sFileURL = ConvertToUrl(sFile)
'Instanciate OOo : the first line is always required from Visual Basic for OOo
  Set oSM = CreateObject("com.sun.star.ServiceManager")
  Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

'We call the MakePropertyValue function, defined just before, to access the structure
  Set OpenPar(0) = MakePropertyValue("ReadOnly", False)
' Set OpenPar(1) = MakePropertyValue("Password", "secret")
  Set OpenPar(1) = MakePropertyValue("Hidden", False)

'Now we can call the OOo loadComponentFromURL method, giving it as
'fourth argument the result of our precedent MakePropertyValue call   
  Set oDoc = oDesk.loadComponentFromURL(sFileURL, "_blank", 0, OpenPar)
  set openDoc = oDoc

     
End Function
'''''''''''''''
sFile ="C:\oo\11.doc"
sFile2 ="C:\oo\22.doc"
set oDoc = openDoc(sFile)  ' открываем файл в который вставить
set oDoc2 = openDoc(sFile2) ' файл, содержащий текст вставки
Flag=True
set TextPointer = oDoc.GetText

set BookmarksSupplier=oDoc.getBookmarks
set Bookmark=BookmarksSupplier.getByName("Zakl").getAnchor
set CursorPointer = Bookmark.CreateTextCursor

' set hh =  TextPointer.getString
Text = "hhhhhhhh"
' Bookmark.setString(Text)  ' работает


   CursorPointer.SetPropertyValue "CharHeight", 22
   CursorPointer.SetPropertyValue "CharFontName", "Arial"

  TextPointer.insertString CursorPointer, Text, false   '  работает

Для решения задачи останется только CursorPointer установить на Bookmark