Macro per identificare le tabelle con collegamento DDE

From The Document Foundation Wiki
< Macros‎ | Writer
Jump to: navigation, search
This page is a translated version of the page Macros/Writer/002 and the translation is 100% complete.

Other languages:
English • ‎français • ‎italiano

Descrizione

Il menu Modifica ▸ Collegamenti a file esterni 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 Modifica ▸ Collegamenti a file esterni 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

  1. DDE: "Dynamic Data Exchange" consente di collegare degli oggetti attraverso dei riferimenti al file, senza doverli incorporare nel documenti.
  2. 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>.
  3. Vedete la documentazione dell'API per com.sun.star.xml.sax.Parser
  4. Vedete la documentazione dell'API per com.sun.star.xml.sax.XDocumentHandler