martedì 31 agosto 2010

Lavorare con le tabelle di Calc

In questo post vedremo come effettuare via macro le operazioni più comuni sulle tabelle di OOo Calc.
Per cominciare occorre ottenere un documento Calc.
Con il codice seguente viene creato un nuovo documento.


    sUrl = "private:factory/scalc" 
    oDoc = StarDesktop.loadComponentFromURL(sUrl,"_default",0, Array())

E' possibile usare lo stesso codice anche per aprire un documento esistente, è sufficiente utilizzare l'URL del documento da aprire al posto di quello usato nell'esempio.
Se si intende lavorare con il documento corrente invece:

    oCalcDocument = StarDesktop.getCurrentComponent()

Oppure, più semplicemente:

    oCalcDocument = ThisComponent

Va detto che le due istruzioni appena illustrate non sono perfettamente equivalenti ma magari dedicherò a questo argomento un post specifico in futuro.
Tornando all'argomento del post, ecco come ottenere l'insieme delle tabelle di un documento Calc:

    oSheets = oCalcDocument.getSheets()

Come recuperare le singole tabelle:

  • Medante indice:

    oCalcSheet = oSheets.getByIndex(0)
    
    ' forma equivalente abbreviata:
    oCalcSheet = oSheets(0)

Come sempre nell'API di OpenOffice.org, l'indice comincia da 0 e rappresenta la posizione della tabella nel documento, pertanto la tabella con indice 0 sarà quella che appare con la linguetta più a sinistra (Tabella1 nella figura)



  • Mediante il nome:
    oCalcSheet = oSheets.getByName("Tabella2")

    ' anche in questo caso esiste una forma equivalente abbreviata:
    oCalcSheet = oSheets("Tabella2")

Rinominare una tabella

    oSheets("Tabella1").Name = "Nuovo nome"

Spostare una tabella:

Il metodo richiede 2 parametri: il nome della tabella da spostare (che deve esistere) e la posizione di destinazione.

    'spostiamola dopo la terza tabella (all'ultima posizione)
    oSheets.moveByName( "Tabella1", 3) 

Aggiungere una tabella:

Il metodo insertNewByName provvede a creare una nuova tabella e inserirla nella posizione specificata. Il metodo prende 2 argomenti: il nome della tabella da creare e la posizione di inserimento.


    oSheets.insertNewByName("Nuova Tabella",3)

Eliminare una tabella:

Questo metodo richiede un solo parametro: il nome della tabella da eliminare.


    oSheets.removeByName("Nuova Tabella") 

Proteggere / sproteggere una tabella:

Il seguente codice imposta la protezione con password sulla tabella “Tabella1”
    oSheets("Tabella1").protect("Password") 
 
Per rimuovere la protezione:

     oSheets("Tabella1").unprotect("Password")

Ecco un modo per controllare se una data tabella è protetta
        If oSheets("Tabella1").IsProtected Then 
        Print "la tabella: " & oCalcSheet.Name & " è protetta!"
        End If

Nascondere/mostrare una tabella:

Occorre ricordare che almeno una tabella deve essere sempre visibile, ovvero non è possibile nascondere tutte le tabelle


    ' nasconde la tabella
    oSheets("Tabella1").IsVisible = False

    ' mostra la tabella
    oSheets("Tabella1").IsVisible = True

Contare le tabelle:

    Print oSheets.getCount()

Enumerare le tabelle:

E' importante ricordare che la prima tabella ha l'indice zero

    For I = 0 to oSheets.Count -1 
        oCalcSheet = oSheets.getByIndex(I)
        print oCalcSheet.Name
    Next I

Usando la scorciatoia del ciclo “For Each” invece non occorre conoscere a priori il numero degli elementi da iterare:

    For Each oCalcSheet In oSheets
        Print oCalcSheet.Name
    Next 

Rendere attiva una tabella:

Occorre prima fare conoscenza con un nuovo oggetto utilissimo, il controller.
Il controller è il servizio che all'interno del documento è responsabile per la gestione dell'interazione con l'utente (ad esempio schermo, tastiera, mouse, la selezione corrente, eccetera)

    oView = oCalcDocument.getCurrentController()
    oCalcSheet = oSheets("Tabella2")
    oView.setActiveSheet(oCalcSheet)

E per quanto riguarda le tabelle di Calc direi che abbiamo visto se non proprio tutto almeno parecchio ;)

--
Paolo

venerdì 27 agosto 2010

OOoCon 2010 (remider!)

Tra pochissimi giorni inizierà l'annuale convegno mondiale di OpenOffice.org: OOoCon 2010.
Quest'anno l'evento avrà luogo avrà luogo a Budapest in Ungheria, dal 31 Agosto al 3 Settembre.
Il PLIO sarà ben rappresentato, infatti tra i relatori figurano:
Italo Vignoli, presidente, con ben tre presentazioni:
    Andrea Pescetti, consigliere e mantainer del progetto linguistico Italiano, con una presentazione sugli strumenti linguistici di OpenOffice.org:
      Per quanto riguarda la programmabilità di OpenOffice.org, macro ed extension, segnalo alcune presentazioni che ritengo molto interessanti:

      Wrap up of the latest Extensions infra structure features 
        di Juergen Schmidt
        Using UNO AWT for creating GUIs in extensions
          di Mihaela Kedikova
          New Extensions in EuroOffice 2010
            di Kazmer Koleszar, Gergely Farkas
            Extension Development for Non-programmers
              di Dmitri Popov
              VBA, can you hack it, yes you can!!
                di Noel Thomas Power, Hui Li



                Bene, concludo con un in bocca al lupo ad Italo e Andrea e buon divertimento a chi ci sarà!!


                a presto
                Paolo

                Scoprire il tipo del documento attivo

                Durante una sessione di lavoro con OpenOffice.org, in un istante qualsiasi può esistere un solo documento attivo che corrisponde al documento contenuto nella finestra di OpenOffice.org che ha il focus in quel dato momento.
                Dato che, a differenza di MS Office, OpenOffice.org è un'applicazione monolitica, il documento attivo può essere di qualunque tipo: un foglio elettronico, un database, un documento di testo e altro ancora.
                Per questo motivo, sviluppando macro, capita abbastanza spesso di avere la necessità di sapere il tipo di documento attivo per poter applicare i metodi appropriati.
                In MS Office esiste un programma eseguibile associato a ciascun tipo di documento, in OpenOffice.org invece esiste un componente specifico associato a ciascun tipo di documento, perciò la questione si riduce a conoscere il componente attivo piuttosto che il documento attivo.
                I componenti sono dei servizi UNOi che hanno particolari caratteristiche. Senza volerci addentrare in dettagli, diciamo solo che i servizi UNO più complessi solitamente mettono a disposizione dei metodi specifici che permettono di identificare il servizio stesso e ottenere informazioni sulle caratteristiche supportate.
                Vediamo ora i metodi più interessanti per il nostro utilizzo:

                Nome Descrizione
                getSupportedServiceNames() Restituisce un array con i nomi di tutti i servizi UNO supportati dall'oggetto, incluso il servizio UNO principale. Questo metodo non prende argomenti
                supportsService( String: ServiceName) Controlla se un particolare servizio è supportato dall'oggetto.
                Il metodo prende in argomento il nome del servizio che si vuole testare e restituisce Vero (True) se il servizio è supportato, Falso (False) se il servizio non è supportato dall'oggetto.

                Vediamo ora come utilizzare quanto osservato fino ad ora per risolvere il problema iniziale, ovvero determinare il tipo di documento attivo.
                Prima di tutto otteniamo un riferimento al documento attivo:

                    oDoc = StarDesktop.getCurrentComponent()
                
                Ora dobbiamo controllare se il componente attivo supporta alcuni servizi specifici che identificano univocamente il tipo di documento.
                Per effettuare il test useremo il metodo supportsService
                Ecco l'elenco dei nomi dei servizi UNO con il tipo di documento associato:

                Servizio UNO Tipo di documento
                com.sun.star.text.TextDocument Documento di testo (Writer)
                com.sun.star.text.WebDocument Documento HTML (Writer)
                com.sun.star.text.GlobalDocument Documento Master (Writer)
                com.sun.star.sheet.SpreadsheetDocument Foglio elettronico (Calc)
                com.sun.star.presentation.PresentationDocument Presentazione (Impress)
                com.sun.star.drawing.DrawingDocument Disegno (Draw)
                com.sun.star.formula.FormularProperties Formula matematica (Math)
                com.sun.star.sdb.OfficeDatabaseDocument Documento database (Base)


                Non rimane altro che scrivere il codice che esegue materialmente il test:

                REM  *****  BASIC  *****
                
                Sub TestDocumentType()
                    oDoc = StarDesktop.getCurrentComponent()
                
                    If oDoc.supportsService("com.sun.star.text.TextDocument") Then
                        MsgBox "Documento di testo OOo Writer"
                    ElseIf oDoc.supportsService("com.sun.star.text.WebDocument") Then
                        MsgBox "Documento HTML di OOo Writer"
                    ElseIf oDoc.supportsService("com.sun.star.text.GlobalDocument") Then
                        MsgBox "Documento Master di OOo Writer"
                    ElseIf oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
                        MsgBox "Foglio elettronico di OOo Calc"
                    ElseIf oDoc.supportsService("com.sun.star.drawing.DrawingDocument") Then
                        MsgBox "Disegno di OOo Draw"
                    ElseIf oDoc.supportsService("com.sun.star.presentation.PresentationDocument") Then
                        MsgBox "Presentazione di OOo Impress"
                    ElseIf oDoc.supportsService("com.sun.star.formula.FormulaProperties") Then
                        MsgBox "Formula matematica di OOo Math"
                    ElseIf oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") Then
                        MsgBox "Documento database di OOo Base"
                    End If
                    
                End Sub
                
                
                Per testare il codice è sufficiente copiarlo in nuovo modulo nella libreria Standard del proprio utente, creare un nuovo documento di qualsiasi tipo, tornare nell ambiente di sviluppo (IDE) di StarBasic e lanciare la macro mediante l'apposito pulanste della barra degli strumenti oppure mediante il tasto
                Per un uso più generalizzato sarebbe opportuno trasformare la routine dell'esempio in una funzione.
                Effettivamente esiste già una funzione simile nella libreria Tools, modulo Misc:


                Si tratta della funzione GetDocumentType().
                Ecco come utilizzarla:

                REM  *****  BASIC  *****
                
                Sub TestToolsFunction()
                
                    oDoc = StarDesktop.getCurrentComponent()
                    
                    'prima di utilizzar el efunzioi della libreria 
                    'condivisa Tools occorre caricarla:
                    BasicLibraries.loadLibrary.Tools
                    
                    'ora è possibile  richiamare la funzione
                    sDocType = GetDocumentType(oDoc)
                    MsgBox sDocType
                    
                End Sub
                 
                La funzione inclusa nella libreria Tools purtroppo non è molto aggiornata e non è in grado di riconoscere i documenti OOo Base, i documenti HTML e i documenti Master
                Alla luce di quanto illustrato fino ad ora dovrebbe essere piuttosto facile modificare la funzione della libreria Tools aggiungendo i tipi di documento mancanti.

                A presto
                Paolo





                sabato 21 agosto 2010

                Ecco il sito di un vero appassionato di MACRO e API !!

                Ecco il sito di un vero appassionato di MACRO e API !!
                Vi prego non fatemela spiegare ;-)
                Comunque posso assicurare che Luca Mazzocchi, autore del sito, non solo è un grande esperto di macrofotografia e profondo conoscitore del mondo dell'apicoltura ma è anche un programmatore di Macro e API di OpenOffice.org. :-)