This ooRexx program creates a scalc spreadsheet, its data and a chart. There is a routine that
allows to fetch constant and enum values in an ooRexx directory, such that sending the name of a
constant or enum value will return the value one has to use as an argument.
/**********************************************************************
AOO_scalc_chart.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>
Using OLE create a new scalc worksheet, create random data and a chart
based on it.
Demonstrates how to use UNO reflection and incorporate UNO_CONSTANTS and
UNO_ENUM
values into a Rexx directory for easier use.
***********************************************************************/
/* create a spreadsheet, add data for comparing two years by quarter, add a
chart */
serviceManager = .OLEObject~new('com.sun.star.ServiceManager')
/* create spreadsheet, get first sheet */
desktop = serviceManager~createInstance('com.sun.star.frame.Desktop')
noProps = .array~new /* empty array (no properties) */
document = desktop~loadComponentFromURL('private:factory/scalc', '_blank',
0, noProps)
sheet = document~sheets~getByIndex(0) -- get first spreadsheet
/* note values can be assigned to cells with "string", "formula" or "value"
(for numbers) */
/* create the titles, pretend the last two yers */
year = date()~right(4)-2
titles = "Quarter", year, year+1 /* title array */
do col = 1 to titles~items
sheet~getCellByPosition(col-1,0)~string = titles[col]
end
/* get all UNO_ENUM values in a Rexx directory */
justify = getAsDirectory(serviceManager,
"com.sun.star.table.CellHoriJustify")
say "justify:" justify
/* right adjust the last two years
- possibility 1:
sheet~getCellRangeByName("B1:C1")~setPropertyValue("HoriJustify",
justify~right)
- or: */
sheet~getCellRangeByName("B1:C1")~HoriJustify = justify~right
/* get all UNO_CONSTANTS values in a Rexx directory */
weights = getAsDirectory(serviceManager,"com.sun.star.awt.FontWeight")
say "weights:" weights
sheet~getCellRangeByName("A1:C1")~CharWeight = weights~bold /* column
headings */
/* create random values for the quarter numbers */
do line = 1 to 4
sheet~getCellByPosition(0,line)~string = "Q"line /* title in first
column */
sheet~getCellByPosition(1,line)~value = random(0,500000)/100
sheet~getCellByPosition(2,line)~value = random(0,750000)/100
end
sheet~getCellRangeByName("A2:A5")~CharWeight = weights~bold /* column
headings */
/* format numbers, predefined style, format: "#,##0.00" */
sheet~getCellRangeByName("B2:C5")~setPropertyValue("NumberFormat",4)
/* create a chart from the data */
structRect = serviceManager~bridge_getStruct("com.sun.star.awt.Rectangle")
structRect~X = 300 -- x-offset: 0.300 cm
structRect~Y = 2250 -- y-offset: 2.250 cm
structRect~Width = 16000 -- width: 16.000 cm
structRect~Height = 8000 -- height: 8.000 cm
range = sheet~getCellRangeByName("A1:C5") /* data to be used for
the chart */
rangeAddr = range~getRangeAddress
arrOfAddr = .array~of(rangeAddr) /* create array with the range address
*/
tableCharts = sheet~getCharts /* get chart collection & insert
*/
tableCharts~addNewByName("FirstChart", structRect, arrOfAddr, .true, .true)
/* Routine returns a Rexx directory containing all names and values of the
supplied
UNO_CONSTANTS or UNO_ENUM class name (needs to be fully qualified). */
::routine getAsDirectory
use strict arg serviceManager, unoClzName
dir = .Directory~new -- directory will get
dir~objectName = unoClzName -- allows to show the uno class it
represents
ctxt = serviceManager~defaultContext
tdm =
ctxt~getValueByName("/singletons/com.sun.star.reflection.theTypeDescriptionManager")
reflClz= tdm~getByHierarchicalName(unoClzName)
if reflClz~isNil then return dir -- return empty directory
typeClass = reflClz~getTypeClass
if typeClass = 30 then -- UNO_CONSTANTS
do
dir~objectName = unoClzName "(UNO_CONSTANTS)" -- supply type info to
name
do c over reflClz~getConstants -- iterate over constant fields
name = c~getName -- fully qualified
name = name~substr(name~lastPos('.')+1) -- extract last word
dir[name] = c~getConstantValue -- store constant values with their
names
-- say "name:" name "->" c~getConstantValue
end
end
else if typeClass = 15 then -- UNO_ENUMERATION
do
dir~objectName = unoClzName "(UNO_ENUM)" -- supply type info to name
enumNames = reflClz~getEnumNames -- get all enumeration names
enumValues = reflClz~getEnumValues -- get all enumeration values
do i=1 to enumNames~items
name = enumNames[i]
name = name~substr(name~lastPos('.')+1) -- extract last word
dir[name] = enumValues[i] -- store enum values with their names
-- say "name:" name "->" enumValues[i]
end
end
return dir
HTH
---rony
P.S.: The short paper at <https://epub.wu.ac.at/8118/> introduces ooRexx briefly in ten pages, home
of Rexx based technologies is the non-profit SIG "Rexx Language Association" at
<https://www.RexxLA.org>.