Macro per identificare le tabelle con collegamento DDE
TDF LibreOffice Document Liberation Project Blog comunitari Weblate Nextcloud Redmine Ask LibreOffice Donazione
Descrizione
Il menu
▸ vi permette di riconoscere i collegamenti presenti in un documento, comprendendo:- File sorgente (URL)
- Elemento (intervallo)
- Tipo (soffice)
- Aggiornamento (automatico/manuale)
Però, né questo approccio, né il navigatore vi consentono di sapere quali sono le tabelle interessate (nome o posizione nel documento).
Lo scopo della macro seguente è quello di localizzare le tabelle create con dei collegamenti DDE.[1]
La macro inserisce nella prima cella di una tabella un commento costituito da:
- file sorgente (ad esempio l'URL di un foglio elettronico di Calc);
- l'intervallo di celle usato all'interno del sorgente.
(Trovate maggiori informazioni sulla manipolazione dei commenti con le macro in Macros/Writer/001/it.)
Notate che la raccolta TextFieldMasters recupererà solamente le informazioni visualizzate dala voce di menu
▸ e TextTables non fornirà altre informazioni aggiuntive.Il collegamento DDE ai dati della tabella è contenuto in un elemento <office:dde-source>[2].
Perciò è possibile scorrere il file content.xml per cercare questo elemento. Il programma inizia controllando che il documento corrente contenga questo file, quindi lo elabora per leggerlo.
Per fare questo viene usato il servizio com.sun.star.xml.sax.Parser[3] in combinazione con il listner com.sun.star.xml.sax.XDocumentHandler[4].
Codice
In LibreOffice Basic:
Option Explicit
' This library is Copyright (C) 2012 Pierre-Yves Samyn, except otherwise indicated
' Purpose: Frame the selection or create an empty frame if no selection
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
' You should have received a copy of the GNU General Public License
' along with this program. If not, see <http://www.gnu.org/licenses/>.
Dim oDoc As Object
Dim oDocHandler As Object
Dim oTableName As String
' Descrizione della macro:
' Contesto : per documenti odt di LibreOffice Writer
' Obiettivo : identificare le tabelle con collegamenti DDE
' Funzione : inserimento di un commento indicante il file sorgente (es. URL del foglio elettronico) e l'intervallo
' Informazione in merito all'utilizzo del parser XML sax delle librerie UNO tramite API:
' http://www.oooforum.org/forum/viewtopic.phtml?t=4907
Sub Comment_DDE_Table()
Dim oContent As Object
Dim oFlux As Object
Dim oSaxParser As Object
Dim oDocEventsHandler As Object
Dim oInputSource As Object
oDoc = ThisComponent
' Esegue la macro solo se il documento è di tipo TextDocument
If oDoc.supportsService("com.sun.star.text.TextDocument") Or _
oDoc.supportsService("com.sun.star.text.GlobalDocument") Then
' Si vuole leggere il file content.xml, quindi si controlla che ThisComponent faccia riferimento ad un oggetto contenente questo file
If oDoc.DocumentStorage.HasByName("content.xml") Then
' Controlla se il documento è stato modificato: verrà letto il file content.xml file perciò
' viene richiesto di salvare, al fine di essere sicuri di lavorare sul contenuto più recente
If oDoc.ismodified Then
MsgBox "Le ultime modifiche al documento devono essere salvate! (Ctrl+S)", 64, "Comment_DDE_Table()"
Else
oContent = oDoc.DocumentStorage.GetByName("content.xml")
oFlux = oContent.GetInputStream()
' Crea il parser XML Sax
oSaxParser = createUnoService( "com.sun.star.xml.sax.Parser" )
' Crea il gestore degli eventi.
' I nomi attribuiti di seguito riflettono il contenuto in conformità a
' http://api.libreoffice.org/common/ref/com/sun/star/xml/sax/XDocumentHandler.html
oDocHandler = CreateUnoListener( "DocHandler_", "com.sun.star.xml.sax.XDocumentHandler" )
oSaxParser.setDocumentHandler( oDocHandler )
' Creazione della struttura in conformità a:
' http://api.libreoffice.org/common/ref/com/sun/star/xml/sax/InputSource.html
oInputSource = createUnoStruct( "com.sun.star.xml.sax.InputSource" )
oInputSource.aInputStream = oFlux
' Indica al parser di leggere i contenuti di content.xml
' Le funzioni (DocHandler_) vengono chiamate a seconda dell'evento.
oSaxParser.parseStream( oInputSource )
oFlux.closeInput()
MsgBox "Fine dell'elaborazione." , 64, "Comment_DDE_Table()"
End If
Else
MsgBox "Questa macro non funziona con questo tipo di documento (è necessario un file odt di Writer)" , 64, "Comment_DDE_Table()"
End If
Else
MsgBox "Questa macro non funziona con questo tipo di documento (è necessario un file odt di Writer)" , 64, "Comment_DDE_Table()"
End If
End Sub ' Comment_DDE_Table
' Di seguito l'elenco delle funzioni del listener corrispondenti agli eventi:
' http://api.libreoffice.org/common/ref/com/sun/star/xml/sax/XDocumentHandler.html
Sub DocHandler_startDocument()
End Sub
Sub DocHandler_endDocument()
End Sub
Sub DocHandler_startElement( cName As String, oAttributes As com.sun.star.xml.sax.XAttributeList )
Dim oTable As Object
Dim oCursor As Object
Dim oComment As Object
Dim oDateHour As New com.sun.star.util.DateTime
' Se l'elemento è una tabelle, viene memorizzato il suo nome
If cName = "table:table" Then
oTableName = oAttributes.getValueByName("table:name")
End If
' Vedete lo standard OASIS Open Document Format for Office Applications:
' http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.html
' I dati del collegamento DDE alla tabella sono contenuti nell'elemento <office:dde-source>.
' L'uso di questo elemento varia a seconda che si tratti fogli elettronici o di documenti di testo.
' Per i documenti di testo l'elemento si trova direttamente all'interno dell'elemento <table:table>
' Quindi controlla se la tabella ha un collegamento DDE:
If cName = "office:dde-source" Then
' Accesso alla tabella:
oTable = oDoc.TextTables.getByName(oTableName)
' Crea un cursore nella prima cella della tabella:
oCursor = oTable.getCellByPosition(0, 0).createTextCursor
' Crea un commento:
oComment = oDoc.createInstance("com.sun.star.text.textfield.Annotation")
' Ottiene la marcatura temporale dell'orario attuale:
With oDateHour
.Minutes = minute(now)
.Hours = hour(now)
.Day = day(now)
.Month = month(now)
.Year = year(now)
End With
' Scrive nel commento il sorgente e l'intervallo del collegamento DDE
With oComment
.Author = "Source: DDE link"
.Content = oAttributes.getValueByName("office:dde-item") & chr(13) &_
oAttributes.getValueByName("office:dde-topic")
.DateTimeValue = oDateHour
End With
' Inserisce il commento nella cella
oComment.attach(oCursor.start)
End If
End Sub ' DocHandler_startElement
Sub DocHandler_endElement( cName As String )
End Sub
Sub DocHandler_characters( cChars As String )
End Sub
Sub DocHandler_ignorableWhitespace( cWhitespace As String )
End Sub
Sub DocHandler_processingInstruction( cTarget As String, cData As String )
End Sub
Sub DocHandler_setDocumentLocator( oLocator As com.sun.star.xml.sax.XLocator )
End Sub
Notes
- ↑ DDE: "Dynamic Data Exchange" consente di collegare degli oggetti attraverso dei riferimenti al file, senza doverli incorporare nel documenti.
- ↑ Vedete lo standard OASIS Open Document Format for Office Applications. L'uso di questo elemento varia a seconda che si tratti fogli elettronici o di documenti di testo. Per i documenti di testo l'elemento si trova direttamente all'interno dell'elemento <table:table>.
- ↑ Vedete la documentazione dell'API per com.sun.star.xml.sax.Parser
- ↑ Vedete la documentazione dell'API per com.sun.star.xml.sax.XDocumentHandler