This is the first of a total of four postings with the intention to demonstrate how to realize the
same functionality of the posted OLE samples without OLE and in a portable way (running unchanged on
Windows, Linux and Apple).
These are samples in the ooRexx scripting language, which usually can be easily adapted to other
languages by replacing the tilde (~), the ooRexx message operator, with a dot (.).
Also, these solutions will use queryInterface() such that one can see for other programming
languages that need to employ queryInterface() what the interface names are. The ooRexx solution
(actually the ooRexx-Java bridge BSF4ooRexx) takes advantage of the available message paradigm and
allows one to merely send the (unqualified) interface name to an UNO object (instead of coding the
entire queryInterface() statement). The fully qualified interface name can always be looked up
quickly from the AOO index for the letter "X":
<https://www.openoffice.org/api/docs/common/ref/index-files/index-24.html>.
Here the portable, OLE-less solution as a follow-up to the matching posting
(see underneath):
/**********************************************************************
swriter_table.rxo: using UNO.CLS (i.e. Java UNO under the hood) 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 UNO.CLS create a new swriter document, a TextTable, a TextFrame,
paragraphs
and apply various formattings.
***********************************************************************/
-- Create the Desktop
xDesktop=uno.createDesktop() -- bootstrap & get access to XDesktop
xcl=xDesktop~XComponentLoader -- get XComponentLoader interface
-- Open a new empty writer document
uri="private:factory/swriter" -- new swriter document
objDocument=xcl~loadComponentFromURL(uri,"_blank",0,.uno~noProps)
-- Create a text object
objText= objDocument~XTextDocument~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)
-- query interface XMultiServiceFactory
objDocument = objDocument~XMultiServiceFactory
-- Create instance of a text table with 4 columns and 4 rows
objTable= objDocument~createInstance(
"com.sun.star.text.TextTable")~XTextTable
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~XPropertySet~setPropertyValue( "BackTransparent", .false)
objTable~XPropertySet~setPropertyValue( "BackColor", 13421823)
-- Set a different background color for the first row
objRow~XPropertySet~setPropertyValue( "BackTransparent", .false)
objRow~XPropertySet~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~XCellRange~getCellRangeByName("A2:D4")
range~XPropertySet~setPropertyValue("NumberFormat", box("short",4)) --
set number format
-- use ParaAdjust: com.sun.star.style.ParagraphAdjust.RIGHT
right=.uno_enum~new("com.sun.star.style.ParagraphAdjust")~right
range~XPropertySet~setPropertyValue("ParaAdjust", right) -- align right
-- Change the CharColor and add a Shadow
objCursor~XPropertySet~setPropertyValue( "CharColor", 255)
objCursor~XPropertySet~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")~XTextFrame
-- Create a Size struct~
objSize = .bsf~new("com.sun.star.awt.Size")
objSize~Width= 15000
objSize~Height= 400
objTextFrame~XShape~setSize( objSize)
-- TextContentAnchorType.AS_CHARACTER = 1
objTextFrame~XPropertySet~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~XPropertySet~setPropertyValue( "CharColor", 65536)
objCursor~XPropertySet~setPropertyValue( "CharShadowed", .false)
-- Insert another string
objText~insertString( objCursor, " That-- s all for now !!", .false)
::requires UNO.CLS -- get UNO support
::routine insertIntoCell
use arg strCellName, strText, objTable
objCellText= objTable~getCellByName( strCellName)~XText
objCellCursor= objCellText~createTextCursor
objCellCursor~XPropertySet~setPropertyValue( "CharColor",16777215)
objCellText~insertString( objCellCursor, strText, .false)
If there are any questions, please ask them.
---rony
On 24.06.2022 12:57, Rony G. Flatscher wrote:
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.