Else
Print "Something else selected = " & oSelections.getImplementationName()
End If
End Sub
While writing the macro in Listing 459, I experienced some initially perplexing behavior.  My initial 
version of Listing 459 would sometimes generate an error as it attempted to enter the subroutine, depending 
on the selected values. The run-time error would complain that an unsupported property or invalid value was
used. To explain the problem (and the solution), notice that there are two places in the code where I assign 
oSelections to a temporary variable and then I use the variable. Listing 460 contains the small sections of 
code extracted from Listing 459.
Listing 460. I assign oSelections to a temporary variable before use.
oCell = oSelections
oCell.setString(s)
.....
oRanges = oSelections
For i = 0 To oRanges.getCount() - 1
SetRangeText(oRanges.getByIndex(i), s)
Next
If oSelections refers to a cell, it doesn’t support the object method getCount(). If oSelections refers to a 
SheetCellRanges object, it doesn’t support the setString() object method. I can but assume that the OOo 
Basic interpreter attempts to resolve the properties and methods that an object references when it is assigned 
a value. For example, if the selections object is a cell, an error is raised because a cell doesn’t support the 
getCount() method. On the other hand, if more than one cell is selected, the returned object does not support 
the setString() method. Although this is not the first time that I have experienced this problem, it is the first 
time that I determined the nature of the problem and how to avoid it.
Selecting text
The current controller is used to determine the current selection, and it can also be used to set the current 
selection. Use the current controller’s select(obj) method to select cells in a sheet. The documentation 
essentially says that if the controller recognizes and is able to select the object passed as an argument, it will.
Listing 461 demonstrates how to select cells.
Listing 461. Select B28:D33 and then select cell A1 instead.
Dim oSheet, oRange, oCell, oController
oController = ThisComponent.getCurrentController()
oSheet = ThisComponent.Sheets(3)
oRange = oSheet.getCellRangeByName("B28:D33")
oController.select(oRange)
oCell = oSheet.getCellByPosition(0, 0)
oController.select(oCell)
The active cell
The active cell contains the cursor. There is an active cell even when multiple cells are selected. 
Unfortunately, OOo does not provide a method to return the active cell when more than one cell is selected. 
Paolo Mantovani posted a very nice solution to this problem on the dev mailing list as shown in Listing 462.
The disadvantage to the macro in Listing 462 is that the active cell is no longer active after the macro runs.
Listing 462. Obtain the active cell.
REM Author: Paolo Mantovani
518
Pdf encryption - C# PDF Digital Signature Library: add, remove, update PDF digital signatures in C#.net, ASP.NET, MVC, WPF
Help to Improve the Security of Your PDF File by Adding Digital Signatures
secure pdf remove; convert locked pdf to word
Pdf encryption - VB.NET PDF Digital Signature Library: add, remove, update PDF digital signatures in vb.net, ASP.NET, MVC, WPF
Guide VB.NET Programmers to Improve the Security of Your PDF File by Adding Digital Signatures
change pdf document security properties; change pdf security settings reader
REM email: mantovani.paolo@tin.it
Sub RetrieveTheActiveCell()
Dim oOldSelection 'The original selection of cell ranges
Dim oRanges       'A blank range created by the document
Dim oActiveCell   'The current active cell
Dim oConv         'The cell address conversion service
Dim oDoc
oDoc = ThisComponent
REM store the current selection
oOldSelection = oDoc.CurrentSelection
REM Create an empty SheetCellRanges service and then select it.
REM This leaves ONLY the active cell selected.
oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
oDoc.CurrentController.Select(oRanges)
REM Get the active cell!
oActiveCell = oDoc.CurrentSelection
oConv = oDoc.createInstance("com.sun.star.table.CellAddressConversion")
oConv.Address = oActiveCell.getCellAddress
Print oConv.UserInterfaceRepresentation
print oConv.PersistentRepresentation
REM Restore the old selection, but lose the previously active cell
oDoc.CurrentController.Select(oOldSelection)
End Sub
15.8.2. General functionality
When searching for view-related functionality, the current controller is a good place to start. Table 213 and
Table 214 contain most of the methods and properties supported by the current controller that have not 
already been discussed.
519
C# PDF Password Library: add, remove, edit PDF file password in C#
A professional PDF encryption and decryption control able to be integrated in C#.NET WinForm and ASP.NET WebForm application. Able
add security to pdf document; create encrypted pdf
Online Remove password from protected PDF file
Find your password-protected PDF and upload it. If there is no strong encryption on your file, it will be unlocked and ready to download within seconds.
decrypt password protected pdf; secure pdf file
Table 213. Methods supported by the current controller not already discussed.
Methods
Description
getActiveSheet()
Get the active spreadsheet.
setActiveSheet(XSpreadsheet)
Cause the specified sheet to become active.
getIsWindowSplit()
Return True if the view is split.
getSplitHorizontal()
Long Integer horizontal split position (in pixels).
getSplitVertical()
Long Integer vertical split position (in pixels).
getSplitColumn()
Long Integer column before which the view is split.
getSplitRow()
Long Integer row before which the view is split.
splitAtPosition(x, y)
Split the view at the specified position. If x=0, the split is only horizontal. 
If y=0, the split is only vertical.
hasFrozenPanes()
True if the view contains frozen panes.
freezeAtPosition(nCol, nRow)
Freeze panes with the specified number of columns and rows.
getFirstVisibleColumn()
Get the first visible column in the pane as a Long Integer.
setFirstVisibleColumn(Long)
Set the first visible column in the pane.
getFirstVisibleRow()
Get the first visible row in the pane as a Long Integer.
setFirstVisibleRow(Long)
Set the first visible row in the pane.
getVisibleRange()
Get the visible range in the pane as a CellRangeAddress.
520
VB.NET PDF File Compress Library: Compress reduce PDF size in vb.
NET class. Also able to uncompress PDF file in VB.NET programs. Support PDF encryption in VB.NET class applications. A professional
change pdf document security; copy locked pdf
VB.NET PDF Password Library: add, remove, edit PDF file password
Dim outputFilePath As String = Program.RootPath + "\\" 3_pw_a.pdf" ' Create a PasswordSetting = New PasswordSetting("Hello World") ' Set encryption level to
copy text from encrypted pdf; convert secure webpage to pdf
Table 214. Properties supported by the current controller not already discussed.
Property
Description
ShowFormulas
If True, formulas are displayed instead of their results.
ShowZeroValues
If True, zero values are visible.
IsValueHighlightingEnabled
If True, strings, values, and formulas are displayed in different colors.
ShowNotes
If True, a marker is shown for notes in cells.
HasVerticalScrollBar
If True, a vertical scroll bar is used in the view.
HasHorizontalScrollBar
If True, a horizontal scroll bar is used in the view.
HasSheetTabs
If True, sheet tabs are used in the view.
IsOutlineSymbolsSet
If True, outline symbols are displayed.
HasColumnRowHeaders
If True, column and row headers are visible.
ShowGrid
If True, cell grid lines are displayed.
GridColor
Grid color as a Long Integer.
ShowHelpLines
If True, help lines are displayed while moving drawing objects.
ShowAnchor
If True, anchor symbols are displayed when drawing objects are selected.
ShowPageBreaks
If True, page breaks are displayed.
SolidHandles
If True, solid (colored) handles are displayed when drawing objects are selected.
ShowObjects
If True, embedded objects are displayed.
ShowCharts
If True, charts are displayed.
ShowDrawing
If True, drawing objects are displayed.
HideSpellMarks
If True, spelling marks are not displayed; this seems to be disabled.
ZoomType
Document zoom type as a com.sun.star.view.DocumentZoomType with the 
following values:
OPTIMAL = 0 – Fit the current page content width (no margins).
PAGE_WIDTH = 1 – Fit the page width at the current selection.
ENTIRE_PAGE = 2 – Fit an entire page.
BY_VALUE = 3 – The zoom is relative and set by ZoomValue.
PAGE_WIDTH_EXACT = 4 – Fit the current width and fit exactly to page 
end.
ZoomValue
Zoom value if the ZoomType is set to BY_VALUE . ZoomType must be set 
before the ZoomValue is set.
15.9. Control Calc from Microsoft Office
It turns out that you can control OOo from within the Microsoft Office family of products. The trick is to 
create a service manager, which starts OOo if it is not currently running. Accessing OOo documents from 
Microsoft Office is similar to accessing OOo documents using other non-StarBasic languages. OOo Basic 
provides nice shortcuts that are not available from Microsoft Office. For example, in OOo Basic, when I 
want the third sheet, I simply use oDoc.Sheets(2); in Microsoft Office, however, you cannot access the 
Sheets property as an array. I wrote and ran the macro in Listing 463 from Microsoft Visual Basic from 
Microsoft Excel.
521
.NET PDF Generator | Generate & Manipulate PDF files
on PDF documents; Add, remove, swap and delete any pages in PDFs; Add metadata of a PDF; Include flexible encryption schemes; Can be
add security to pdf; create pdf the security level is set to high
C# PDF File Permission Library: add, remove, update PDF file
3.pdf"; String outputFilePath = Program.RootPath + "\\" 3_pw_a.pdf"; // Create a new PasswordSetting("Hello World"); // Set encryption level to AES-128.
convert locked pdf to word doc; pdf unlock
Listing 463. ControlOOo() demonstrates how to control OOo from Excel.
Sub ControlOOo()
Rem The service manager is always the first thing to create.
Rem If OOo is not running, it is started.
Set oManager = CreateObject("com.sun.star.ServiceManager")
Rem Create the desktop.
Set oDesktop = oManager.createInstance("com.sun.star.frame.Desktop")
Rem Open a new empty Calc document.
Dim args()
Dim s As String
Set s = "private:factory/scalc"
Set oDoc = oDesktop.loadComponentFromURL(s, "_blank", 0, args())
Dim oSheet As Object
Dim oSheets As Object
Dim oCell As Object
Set oSheets = oDoc.sheets.CreateEnumeration
Set oSheet = oSheets.nextElement
Set oCell = oSheet.getCellByPosition(0, 0)
oCell.setFormula ("Hello From Excel") 'Cell A1
oCell.CellBackColor = RGB(127, 127, 127)
End Sub
15.10. Accessing Calc functions
You can call Calc functions from a macro.
Listing 464. Call the MIN function directly.
Sub callFunction
Dim oFA
oFA = createUnoService( "com.sun.star.sheet.FunctionAccess" )
' Calculate min of numbers.
print oFA.callFunction( "MIN", array( 10, 23, 5, 345 ) )
End Sub 
15.11. Finding URLs in Calc
In a Calc document, links (URLs) are stored in text fields. The following macro enumerates the text content 
in cell A1 of the first sheet for URLs. Note that the presentation and the URL may be different.
Listing 465. Finds URLS in a sheet cell.
Sub FindHyperLinkInCell
Dim oCell, oText, oParEnum, oParElement
Dim oEnum, oElement 
oCell = ThisComponent.Sheets(0).getCellByPosition(0, 0)
oParEnum = oCell.getText().createEnumeration()
Do While oParEnum.hasMoreElements ()
oParElement = oParEnum.nextElement()
oEnum = oParElement.createEnumeration()
Do While oEnum.hasMoreElements ()
522
VB.NET PDF File Permission Library: add, remove, update PDF file
Dim outputFilePath As String = Program.RootPath + "\\" 3_pw_a.pdf" ' Create a PasswordSetting = New PasswordSetting("Hello World") ' Set encryption level to
convert locked pdf to word online; copy text from locked pdf
PDF Image Viewer| What is PDF
Promote use of metadata; Used on independent devices and applications; Prohibit encryption; Provide two levels of compliance PDF/A-1b (the lowest level) and PDF
decrypt password protected pdf; change pdf document security
oElement = oEnum.nextElement()
If oElement.TextPortionType = "TextField" Then
If oElement.TextField.supportsService("com.sun.star.text.TextField.URL") Then
'STRING  Representation = 
'STRING  TargetFrame = 
'STRING  URL = 
Print oElement.TextField.URL
End If
End If
Loop
Loop
End Sub 
15.12. Importing and Exporting XML Files Using Calc
This section, originally written by Volker Lenhardt, discusses simple methods for importing and exporting 
Extensible Markup Language (XML) files. The ideas and code are taken from a working project.
XML is a formal description of tags and how tags can be combined to form a hierarchical data structure. You
can choose the tag and attributes names as you like – within limits. HTML is XML with fewer rules – so 
valid HTML need not be valid XML. Wikipedia is a good place to learn more about XML.
Warn
Some methods caused OOo version 3.3 to crash; for example, getElementsByTagName crashed for some 
tag names. The methods functioned correctly with LibreOffice, I have not checked them against AOO.
XML files are simple text files. If you need to regularly convert XML to Calc or Base you could write an 
XSLT filter, which is not covered in this book.
Most modern programming languages have implemented two tools to import XML data: SAX (Simple API 
for XML) and DOM (Document Object Model). UNO defines com.sun.star.xml.sax.XParser for SAX 
processing and com.sun.star.xml.dom.DocumentBuilder for DOM processing. The main difference between 
these two tools is the way that they read the data from the file. SAX reads the data continually, the Basic 
code implements a listener to handle the data as it is read. DOM, on the other hand, reads all of the data into 
an in memory hierarchically structured object. DOM is fast, but uses more memory, SAX can easily handle 
large files. This section covers DOM, not SAX. The coverage ignores complex topics such as validation, 
name spaces, and exceptions.
Tip
It is very important that you are acquainted with the data structure of the XML file in question.
15.12.1. Read an XML file
The com.sun.star.xml.dom.DocumentBuilder service has two parse methods that return the entire data tree 
as a DOM object. The first parse method accepts an input stream, which may come from anywhere; for a 
simple text file, SimpleFileAccess can return an input stream. The second parse method accepts the URL of 
the file (see Listing 466).
Listing 466. Read an XML file.
REM Build a DOM Document tree from an XML file.
Function BuildDOMDoc(sUrl As String)
Dim oDocBuilder
523
.NET Annotation SDK| Annotate, Redact Images
Rich options to move, resize, rotate, scale any kind of annotation; Provide enhanced redaction & encryption objects for sensitive information & security;
decrypt a pdf; pdf password security
C# Image: How to Annotate Image with Freehand Line in .NET Project
Tutorials on how to add freehand line objects to PDF, Word and TIFF SDK; Protect sensitive image information with redaction and encryption annotation objects;
change security settings on pdf; decrypt pdf online
Dim oDOM
BuildDOMDoc = oDOM
On Error Goto Catch
oDocBuilder = createUnoService("com.sun.star.xml.dom.DocumentBuilder")
REM oDocBuilder reads the complete XML file and returns an object
REM containing a tree structure of all "nodes".
oDOM = oDocBuilder.parseURI(sURL)
REM There were no errors.
oDOM.normalize()
BuildDOMDoc = oDOM
Exit Function
Catch:
MsgBox "Error while importing the XML data " & CHR$(10) & CHR$(10) _
& Error$ & " " & CHR$(10) & " "16"XML Import"
End Function
The XML file in Listing 467 is based on a real example. The entire document contains an outer slots tag, 
which represents a database. Each record is called a slot, some are active, some are reserved, some are free. 
Each slot represents a single client.
Listing 467. Sample XML file.
<slots>
<slot status="active" ID="10317">
<document ID="1234" title="Boom boom" />
<validTo>12/03/2011</validTo>
<customer name="Becker" gender="m" ID="11051" email="bb@tennis.de
" />
</slot>
<slot status="free" ID="60072">
</slot>
</slots>
The problem was to create a mail merge to ask active clients about to expire if they desired to prolong their 
service. The macro needed to appropriately filter the data based on the status attribute and ValidTo element, 
then extract the name, gender, email, ID, and document title. The elements, attributes, and text contents are 
represented as “nodes” in the DOM tree; the entire document is the root node. The 
com.sun.star.xml.dom.XNode API documentation describes this primary DOM datatype as follows:
“The Node interface is the primary datatype for the entire Document Object Model. It represents a single 
node in the document tree. While all objects implementing the Node interface expose methods for dealing 
with children, not all objects implementing the Node interface may have children. For example, Text nodes 
may not have children, and adding children to such nodes results in a DOMException being raised.
The “nodeName”, “nodeValue”, and “attributes” properties provide access to commonly used data from a 
node. The property returns null if there is no obvious mapping of these attributes for a specific nodeType; for
example, a comment cannot have attributes. Specific node types may contain additional more convenient 
mechanisms to get and set relevant information.
524
Table 215 shows the specialized node interfaces that are derived from XNode together with their types, 
names, and values. The node type is the corresponding value from the com.sun.star.xml.dom.NodeType 
enumeration.
Table 215. Specialized Nodes.
Interface
Node Type
Node Name 
Node Value
XAttr
ATTRIBUTE_NODE
The name of the 
attribute
The value of the attribute
XCDATASection
CDATA_SECTION_NODE
"#cdata-section"
The content of the CDATA 
section
XComment
COMMENT_NODE
"#comment"
The content of the comment
XDocument
DOCUMENT_NODE
"#document"
Null
XDocumentFragment
DOCUMENT_FRAGMENT_NODE
"#document-fragment"
Null
XDocumentType
DOCUMENT_TYPE_NODE
The document type 
name
Null
XElement
ELEMENT_NODE
The tag name
Null
XEntity
ENTITY_NODE
The entity name
Null
XEntityReference
ENTITY_REFERENCE_NODE
The name of entity 
referenced
Null
XNotation
NOTATION_NODE
The notation name
Null
XProcessingInstruction
PROCESSING_INSTRUCTION_NODE
The target
The entire content excluding 
the target
XText
TEXT_NODE
"#text"
The content of the text node
For the methods implemented with XNode see Table 216.
Table 216. Methods implemented in the com.sun.star.xml.dom.XNode interface.
Method
Description
appendChild(newChild)
Adds the node newChild to the end of the list of children of this node.
cloneNode(deep As boolean)
Returns a duplicate of this node, i.e., serves as a generic copy constructor for nodes.
Parameter deep: True = clone node together with any children,  False = clone without 
children
getAttributes()
Returns a NamedNodeMap containing the attributes of this node (if it is an Element) or
null otherwise.
getChildNodes()
Returns a NodeList that contains all children of this node.
getFirstChild()
Returns the first child of this node.
getLastChild()
Returns the last child of this node.
getLocalName()
Returns the local part of the qualified name of this node.
getNamespaceURI()
The namespace URI of this node, or null if it is unspecified.
getNextSibling()
Returns the node immediately following this node.
getNodeName()
The name of this node, depending on its type; see the table above.
getNodeType()
A code representing the type of the underlying object, as defined above.
getNodeValue()
Returns the value of this node.
getOwnerDocument()
The Document object associated with this node.
525
Method
Description
getParentNode()
The parent of this node.
getPrefix()
The namespace prefix of this node, or null if it is unspecified.
getPreviousSibling()
The node immediately preceding this node.
hasAttributes()
Returns whether this node (if it is an element) has any attributes.
hasChildNodes()
Returns whether this node has any children.
insertBefore(newChild, refChild)
Inserts the node newChild before the existing child node refChild.
isSupported(feature, ver)
Tests whether the DOM implementation implements a specific feature and that feature 
is supported by this node.
normalize()
Puts all Text nodes in the full depth of the sub-tree underneath this Node, including 
attribute nodes, into a "normal" form where only structure (e.g., elements, comments, 
processing instructions, CDATA sections, and entity references) separates Text nodes, 
i.e., there are neither adjacent Text nodes nor empty Text nodes.
removeChild(oldChild)
Removes the child node indicated by oldChild from the list of children, and returns it.
replaceChild(newChild, oldChild)
Replaces the child node oldChild with newChild in the list of children, and returns the 
oldChild node. 
setNodeValue(nodeValue)
The value of this node, depending on its type; see the table above.
setPrefix(prefix)
The namespace prefix of this node, or null if it is unspecified.
A node list is usually returned as a com.sun.star.xml.dom.XNodeList interface. The most used methods from
the XNodeList interface are getLength(), to determine the number of listed nodes, and item(Long) to get a 
single node based on its location in the list. A node list is sometimes returned as a the 
com.sun.star.xml.dom.XNamedNodeMap interface, which provides access to the contained nodes by name. 
The following macro demonstrates three methods for getting the value of an element attribute.
Listing 468. Three ways to get an attribute from an element.
'The long way
oAttList = oElement.getAttributes          ' Get all attributes.
oAttNode = oAttList.getNamedItem("ID")     ' Get the attribute node from attributes.
sAttVal = oAttNode.getValue                ' Get the value from the attribute node.
'A shorter way
oAttNode = oElement.getAttributeNode("ID"' Get the attribute node from the element.
sAttVal = oAttNode.getValue                ' Get the value from the attribute node.
'The shortest way
sAttVal = oElement.getAttribute("ID")      ' Get the value directly from the node.
Recursion is typically used to parse DOM documents.
oElemList = oElem.getChildNodes        'At the very start oElem is oDOM
For i = 0 To oElemList.getLength – 1
oElem = oElemList.item(i)
Select Case oElem.getNodeType
Case com.sun.star.xml.dom.ELEMENT_NODE
sName = oElem.getNodeName
If oElem.hasAttributes Then
oAtts = oElem.getAttributes
For j = 0 To oAtts.getLength – 1
sName = oAtts.item(j).getName
sValue = oAtts.item(j).getValue
526
'Further work to be done
Next
End If
If oElem.hasChildNodes Then
'Start the recursion here
End If
Case com.sun.star.xml.dom.TEXT_NODE
sText = oElem.getNodeValue
'Further work to be done
'More Case statements for the node types in Table 215
End Select
Next
TIP
When you encounter a text node between different element nodes, you most probably have found ignorable
white space; so you can probably ignore it.
In the slots example, we do not need to iterate over all the nodes because we know the structure and we only
need specific nodes. Use getElementsByTagName(name) to start with a limited number of elements.  Listing
469 shows how to extract the desired data into a Calc sheet. First, the XML file is created, and then it is read
into a new Calc document.
Listing 469. Parse an XML file to extract specific data into a CalcFile..
REM Import an XML file using DOM and extract specific data into a Calc file
Sub XMLImport
Dim sURL As String     'Whole path of the XML file in URL notation
Dim oCalcDoc           'Destination spreadsheet document
Dim oSheet             'Destination table
Dim oWriterDoc         'Text document to show the original XML text file
Dim oDOM               'The DOM document tree
Dim tDeadline as Date  'A specific date to filter the data
REM Create an example XML file with fancy data
sURL = GetWorkDir() & "/oome_xml_import.xml"
MakeXMLExampleFile(sUrl)
Wait 500               'Give the OS time to store the file to disk
tDeadline = DateValue(CDate(Now + 20))
REM Build the DOM tree
oDOM = BuildDOMDoc(sUrl)
If IsEmpty(oDOM) Then Exit Sub  'There was an error loading the XML file
REM Copy specific data into a new Calc spreadsheet
oCalcDoc = StarDesktop.loadComponentFromURL( _
"private:factory/scalc""_blank"0, Array())
oSheet = oCalcDoc.Sheets(0)
GetData(oDOMoSheet, tDeadline)
REM Show the original XML text file in a new Writer text document
REM LibreOffice requires that the FilterName be specified, AOO does not.
Dim noArgs(1) As New com.sun.star.beans.PropertyValue
noArgs(0).Name = "FilterName"
noArgs(0).Value = "Text" 
oWriterDoc = StarDesktop.loadComponentFromURL(sUrl"_blank"0noArgs() )
527
Documents you may be interested
Documents you may be interested