Having looked around some nutshell OLE samples to port to ooRexx I stumbled over <https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Automation_Bridge> which depicts a VBScript example.

There are the following changes in the ooRexx code:

 * the "=sum" formula now has the cells and the + operator to add them up,
 * the TextTable numbers are formatted to #,###.00 and right adjusted.

Ad ooRexx: I use it to teach BA students programming from zero to Windows to Java in a four hour lecture in a semester (four months). The Java part includes the knowledge to apply ooRexx via the UNO Java bindings (one can use ooRexx to interact with Java objects, such that the students do not need to know Java, they just need to be able to read Java documentation).

ooRexx implements the message paradigm: a value (an object, an instance) is conceptually like a living thing that understands messages one sends to it, which causes the value to look for a method by the same name (supplying arguments, if any) which it invokes and returns any return value if any. The message operator is the tilde (~), the receiver is on the left hand side, the message name on the right hand side. (The short paper at <https://epub.wu.ac.at/8118/> introduces ooRexx briefly in ten pages.)

Usually one can turn VB code into ooRexx by replacing dots with a tilde, however it also works the other way round by replacing tildes with dots . :)

Here the transcription:

   /**********************************************************************
     AOO_swriter_table.rex using OLE (object linking and embedding) with ooRexx

     Links: <https://OpenOffice.org>
   
<https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Automation_Bridge>
   <https://www.pitonyak.org/oo.php>
   <https://www.openoffice.org/udk/common/man/spec/ole_bridge.html>

     This is the ooRexx version (which includes corrections) of the VBScript
     "A Quick Tour" example from the AOO (Apache OpenOffice) DevGuide, chapter
     "Automation_Bridge" documentation.

     Using OLE create a new swriter document, a TextTable, a TextFrame, 
paragraphs
     and apply various formatings.
   ***********************************************************************/

      -- The service manager is always the starting point
      -- If there is no office running then an office is started up
      objServiceManager= .OleObject~new("com.sun.star.ServiceManager")

      -- Create the Desktop
      objDesktop= objServiceManager~createInstance("com.sun.star.frame.Desktop")

      -- Open a new empty writer document
      args=.array~new
      objDocument= objDesktop~loadComponentFromURL("private:factory/swriter", 
"_blank", 0, args)

      -- Create a text object
      objText= objDocument~getText

      -- Create a cursor object
      objCursor= objText~createTextCursor

      -- Inserting some Text
      vbLf = "0a"x    -- line-feed character
      objText~insertString( objCursor, "The first line in the newly created text 
document."vbLf,
   .false)

      -- Inserting a second line
      objText~insertString( objCursor, "Now we-- re in the second line", .false)

      -- Create instance of a text table with 4 columns and 4 rows
      objTable= objDocument~createInstance( "com.sun.star.text.TextTable")
      objTable~initialize( 4, 4 )

      -- Insert the table
      objText~insertTextContent( objCursor, objTable, .false)

      -- Get first row
      objRows= objTable~getRows
      objRow= objRows~getByIndex( 0)

      -- Set the table background color
      objTable~setPropertyValue( "BackTransparent", .false)
      objTable~setPropertyValue( "BackColor", 13421823)

      -- Set a different background color for the first row
      objRow~setPropertyValue( "BackTransparent", .false)
      objRow~setPropertyValue( "BackColor", 6710932)

      -- Fill the first table row
      call insertIntoCell "A1","FirstColumn", objTable -- insertIntoCell is a 
helper function, see
   below
      call insertIntoCell "B1","SecondColumn", objTable
      call insertIntoCell "C1","ThirdColumn", objTable
      call insertIntoCell "D1","SUM", objTable

      objTable~getCellByName("A2")~setValue( 22.5     )
      objTable~getCellByName("B2")~setValue( 5615.3   )
      objTable~getCellByName("C2")~setValue( -2315.7  )
      objTable~getCellByName("D2")~setFormula( "=sum <A2>+<B2>+<C2>"  )

      objTable~getCellByName("A3")~setValue( 21.5     )
      objTable~getCellByName("B3")~setValue( 615.3    )
      objTable~getCellByName("C3")~setValue( -315.7   )
      objTable~getCellByName("D3")~setFormula( "sum <A3>+<B3>+<C3>" )

      objTable~getCellByName("A4")~setValue( 121.5    )
      objTable~getCellByName("B4")~setValue( -615.3   )
      objTable~getCellByName("C4")~setValue( 415.7    )
      objTable~getCellByName("D4")~setFormula( "sum <A4>+<B4>+<C4>" )

      range=objTable~getCellRangeByName("A2:D4")
      range~setPropertyValue("NumberFormat", 4)  -- set number format
      -- use ParaAdjust: com.sun.star.style.ParagraphAdjust.RIGHT
      range~setPropertyValue("ParaAdjust", 1)    -- align right

      -- Change the CharColor and add a Shadow
      objCursor~setPropertyValue( "CharColor", 255)
      objCursor~setPropertyValue( "CharShadowed", .true)

      -- Create a paragraph break
      -- The second argument is a 
com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
      objText~insertControlCharacter( objCursor, 0 , .false)

      -- Inserting colored Text.
      objText~insertString( objCursor, " This is a colored Text - blue with 
shadow"vbLf, .false)

      -- Create a paragraph break ( ControlCharacter::PARAGRAPH_BREAK).
      objText~insertControlCharacter( objCursor, 0, .false)

      -- Create a TextFrame~
      objTextFrame= objDocument~createInstance("com.sun.star.text.TextFrame")

      -- Create a Size struct~
      objSize = objServiceManager~Bridge_GetStruct("com.sun.star.awt.Size")
      objSize~Width= 15000
      objSize~Height= 400
      objTextFrame~setSize( objSize)

      --  TextContentAnchorType.AS_CHARACTER = 1
      objTextFrame~setPropertyValue( "AnchorType", 1)

      -- insert the frame
      objText~insertTextContent( objCursor, objTextFrame, .false)

      -- Get the text object of the frame
      objFrameText= objTextFrame~getText

      -- Create a cursor object
      objFrameTextCursor= objFrameText~createTextCursor

      -- Inserting some Text
      objFrameText~insertString( objFrameTextCursor, "The first line in the 
newly created text
   frame.", -
                                 .false)
      objFrameText~insertString( objFrameTextCursor, -
               vbLf"With this second line the height of the frame raises.", 
.false)

      -- Create a paragraph break
      -- The second argument is a 
com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK constant
      objFrameText~insertControlCharacter( objCursor, 0 , .false)

      -- Change the CharColor and remove the Shadow
      objCursor~setPropertyValue( "CharColor", 65536)
      objCursor~setPropertyValue( "CharShadowed", .false)

      -- Insert another string
      objText~insertString( objCursor, " That-- s all for now !!", .false)

   ::routine insertIntoCell
      use arg strCellName, strText, objTable

      objCellText= objTable~getCellByName( strCellName)
      objCellCursor= objCellText~createTextCursor
      objCellCursor~setPropertyValue( "CharColor",16777215)
      objCellText~insertString( objCellCursor, strText, .false)

---rony

P.S.: As I have not found too many self-contained OLE nutshell samples I came up with additional examples for swriter, scalc and simpress which I will post one by one to ease locating them via search engines. Although they will be in the rather unknown ooRexx language it will be simple to translate them to VBS or other programming languages that support OLE.

Reply via email to