[Risolto] Macro per cancellare righe tabella

Creare una macro - Scrivere uno script - Usare le API
Rispondi
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

[Risolto] Macro per cancellare righe tabella

Messaggio da paolokap »

Salve a tutti.
Avrei bisogno di aiuto. Al momento non sono capace (ma mi sa che neanche in futuro lo sarò) di scrivere una macro che faccia la seguente cosa: ho un documento writer (allego il modello) nel quale c'è una tabella formata da 7 righe e 2 colonne (fisse per ogni pagina ). Questa tabella viene riempita utilizzando la stampa in serie e quindi ottengo un certo numero di pagine con tabella. Il fatto è che non tutte le righe verranno riempite e quindi mi tocca cancellarle a mano.
Quindi mi serverebbe una macro che "legga" la tabella e se nella seconda colonna c'è € 0,00 deve cancellare l'intera riga.
E' facile scrivere una macro del genere?
Grazie a chiunque possa aiutarmi
Allegati
modello tab1.odt
(12.68 KiB) Scaricato 125 volte
Ultima modifica di paolokap il lunedì 13 gennaio 2020, 12:52, modificato 4 volte in totale.
LibreOffice 7.4 Kubuntu 22.04 LTS
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro per cancellare righe tabella

Messaggio da patel »

Facile non è, inoltre nella tua tabella allegata con ci sono colonne valorizzate a zero, comunque prova questa

Codice: Seleziona tutto

Sub remove
sTableName = "Tabella4"
oTables = ThisComponent.TextTables
oTable = oTables(sTableName)
nr = oTable.getRows().Count 
for n = nr to 1 step -1
  if  left(oTable.getCellByName("B" & n).getString(),1) = "<" then oTable.getRows().RemoveByIndex(n-1,1)
next
End Sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

Grazie ptel,
si nella documento che ho postato non ci sono zeri perché era solo un modello. Però il documento che genero con la stampa in serie genera in alcuni casi zero e poi sono più fogli.
Ora provo sul documento reale.
Grazie
LibreOffice 7.4 Kubuntu 22.04 LTS
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro per cancellare righe tabella

Messaggio da patel »

ovviamente devi adeguare la riga
if left(oTable.getCellByName("B" & n).getString(),1) = "<" then
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

Ciao patel,
ho provato ma non funziona.
Poi ho notato che c'è un'istruzione sTableName = "Tabella4" che, se ho capito bene, fa riferimento al nome della tabella presente nel modello che ho allegato.
Se è così allora non dovrebbe funzionare sul documento che poi effettivamente ho perché il documento, come detto, si genera mediante la stampa in serie e quindi avrò N pagine con N tabelle diverse.
Nel documento che genero ho visto che le tabelle hanno nomi diversi del tipo:
la prima tabella si chiama Tabella4
la seconda MailMergeTable2020-01-11T13:22:46Z3
la terza MailMergeTable2020-01-11T13:22:46Z5
........................
l'ultima MailMergeTable2020-01-11T13:22:49Z55

In questo caso in numero di pagine del documento è pari a 28 e quindi ho 28 tabelle
LibreOffice 7.4 Kubuntu 22.04 LTS
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

patel ha scritto:ovviamente devi adeguare la riga
if left(oTable.getCellByName("B" & n).getString(),1) = "<" then
Adeguare come?? :crazy:
LibreOffice 7.4 Kubuntu 22.04 LTS
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro per cancellare righe tabella

Messaggio da patel »

nel file allegato l'ultima riga aveva una stringa che iniziava per <
devi allegare un file più realistico
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

Ho cambiato il file allegato. Questo è quello più vicino alla realtà.
Nella prima colonna, indipendentemente dalla riga può capitare qualsiasi cosa: può essere vuoto come nel file allegato, ci può essere una serie di parole etc.
Invece nella seconda colonna ci può essere € 0,00 (vedi file allegato) oppure numeri diversi da zero.
Quindi l'unica cosa sicura è che nella seconda colonna ci possono essere zeri oppure no
LibreOffice 7.4 Kubuntu 22.04 LTS
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro per cancellare righe tabella

Messaggio da patel »

nel nuovo allegato c'è una sola tabella, tu hai detto che possono essere molte, ti avevo chiesto un esempio realistico, comunque prova questa

Codice: Seleziona tutto

Sub removeAll
oTables = ThisComponent.TextTables
For i = 0 To oTables.getCount() - 1
   nr = oTables(i).getRows().Count 
   for n = nr to 1 step -1
     if  oTables(i).getCellByName("B" & n).getString() = "€ 0,00" then oTables(i).getRows().RemoveByIndex(n-1,1)
   next
Next
End Sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

Ok pensavo che andasse bene il modello con una sola tabella.
Comunque ti allego un file reale (ovviamente ho tolto le info riservate). Questo file è stato ottenuto da una stampa in serie. Il numero di pagine varia, non è sempre lo stesso. Possono essere 10 pagine o 100. Come vedi la prima colonna può contenere (oppure non contenere nulla) può contenere qualsiasi cosa. Mentre la seconda contiene solo cifre che o sono diverse da zero oppure pari a € 0,00. La macro deve cancellare queste ultima righe indipendentemente da quello che c'è nella prima colonna
Nel frattempo provo il nuovo codice che hai scritto e grazie 1000 :-)
Allegati
filetipo.odt
(22.25 KiB) Scaricato 116 volte
LibreOffice 7.4 Kubuntu 22.04 LTS
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

Funziona!!!!!
L'ho provata sul file tipo che ho allegato è funziona. :D :D :D
Devo solo fare un controllo finale .
Una domanda: la macro funziona indipendentemente dal numero di righe presenti nella tabella? Cioè il file che ho io al momento presenta 8 righe (in realtà l'ultima può anche non essere considerata perché avrà sempre un valore diverso da zero). Nel caso dovessi aumentare le righe? oppure diminuirle?
Comunque studierò la macro che hai scritto per cercare di imparare. Pensavo fosse più complicata e che si dovesse usare quelle funzioni tipo createUnoService("com.sun.star.frame.Desktop") o simili che al momento non so come cavolo si usano.

Grazie

P.S. Perfetto!!!
LibreOffice 7.4 Kubuntu 22.04 LTS
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro per cancellare righe tabella

Messaggio da patel »

la macro calcola il numero delle righe con

Codice: Seleziona tutto

nr = oTables(i).getRows().Count
, ma solo tu puoi fare le prove.
Non perdere tempo sulle funzioni UNO, non arriverai mai a saperle usare, studia su Pitonyak come ho fatto io.
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: Macro per cancellare righe tabella

Messaggio da paolokap »

Infatti leggendo con calma il codice avevo intuito che la riga nr= etc contasse il numero di righe nella tabella e che quindi vale per ogni tabella.

Ma perché si possono fare queste cose senza le UNO?? Avevo capito dal wiki di openoffice che bisognava impararle ad usare?
Si conosco il Pitonyak ma, oltre ad essere un po' complicato, è pure in inglese e ovviamente ci metto molto più tempo a studiarlo.
Ti faccio una domanda: ma se è possibile utilizzare le macro da applicare ai vari documenti senza le UNO, allora questa cosa si può anche fare anche con il python senza usare le UNO?
LibreOffice 7.4 Kubuntu 22.04 LTS
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro per cancellare righe tabella

Messaggio da patel »

certamente, ecco una macro in python, non mia, per costruire una tabella

Codice: Seleziona tutto

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import uno

# a UNO struct later needed to create a document
from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
from com.sun.star.text.TextContentAnchorType import AS_CHARACTER
from com.sun.star.awt import Size

from com.sun.star.lang import XMain

def insertTextIntoCell( table, cellName, text, color ):
    tableText = table.getCellByName( cellName )
    cursor = tableText.createTextCursor()
    cursor.setPropertyValue( "CharColor", color )
    tableText.setString( text )


def createTable():
    """creates a new writer document and inserts a table with some data (also known as the SWriter sample)""" 
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
    
    # open a writer document
    doc = desktop.loadComponentFromURL( "private:factory/swriter","_blank", 0, () )
    
    text = doc.Text
    cursor = text.createTextCursor()
    text.insertString( cursor, "The first line in the newly created text document.\n", 0 )
    text.insertString( cursor, "Now we are in the second line\n" , 0 )
    
    # create a text table
    table = doc.createInstance( "com.sun.star.text.TextTable" )

    # with 4 rows and 4 columns
    table.initialize( 4,4)

    text.insertTextContent( cursor, table, 0 )
    rows = table.Rows

    table.setPropertyValue( "BackTransparent", uno.Bool(0) )
    table.setPropertyValue( "BackColor", 13421823 )
    row = rows.getByIndex(0)
    row.setPropertyValue( "BackTransparent", uno.Bool(0) )
    row.setPropertyValue( "BackColor", 6710932 )

    textColor = 16777215

    insertTextIntoCell( table, "A1", "FirstColumn", textColor )
    insertTextIntoCell( table, "B1", "SecondColumn", textColor )
    insertTextIntoCell( table, "C1", "ThirdColumn", textColor )
    insertTextIntoCell( table, "D1", "SUM", textColor )

    values = ( (22.5,21.5,121.5),
              (5615.3,615.3,-615.3),
              (-2315.7,315.7,415.7) )
    table.getCellByName("A2").setValue(22.5)
    table.getCellByName("B2").setValue(5615.3)
    table.getCellByName("C2").setValue(-2315.7)
    table.getCellByName("D2").setFormula("sum <A2:C2>")

    table.getCellByName("A3").setValue(21.5)
    table.getCellByName("B3").setValue(615.3)
    table.getCellByName("C3").setValue(-315.7)
    table.getCellByName("D3").setFormula("sum <A3:C3>")

    table.getCellByName("A4").setValue(121.5)
    table.getCellByName("B4").setValue(-615.3)
    table.getCellByName("C4").setValue(415.7)
    table.getCellByName("D4").setFormula("sum <A4:C4>")


    cursor.setPropertyValue( "CharColor", 255 )
    cursor.setPropertyValue( "CharShadowed", uno.Bool(1) )

    text.insertControlCharacter( cursor, PARAGRAPH_BREAK, 0 )
    text.insertString( cursor, " This is a colored Text - blue with shadow\n" , 0 )
    text.insertControlCharacter( cursor, PARAGRAPH_BREAK, 0 )

    textFrame = doc.createInstance( "com.sun.star.text.TextFrame" )
    textFrame.setSize( Size(15000,400))
    textFrame.setPropertyValue( "AnchorType" , AS_CHARACTER )

    text.insertTextContent( cursor, textFrame, 0 )

    textInTextFrame = textFrame.getText()
    cursorInTextFrame = textInTextFrame.createTextCursor()
    textInTextFrame.insertString( cursorInTextFrame, "The first line in the newly created text frame.", 0 )
    textInTextFrame.insertString( cursorInTextFrame, "\nWith this second line the height of the rame raises.",0)
    text.insertControlCharacter( cursor, PARAGRAPH_BREAK, 0 )

    cursor.setPropertyValue( "CharColor", 65536 )
    cursor.setPropertyValue( "CharShadowed", uno.Bool(0) )

    text.insertString( cursor, " That's all for now !!" , 0 )

g_exportedScripts = createTable,
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
paolokap
Messaggi: 353
Iscritto il: giovedì 9 ottobre 2014, 13:09

Re: [Risolto] Macro per cancellare righe tabella

Messaggio da paolokap »

Sarebbe interessante vedere come sarebbe in python la macro che hai scritto
LibreOffice 7.4 Kubuntu 22.04 LTS
Rispondi