Macro per identificare le tabelle con collegamento DDE

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


    Other languages:

    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