[Risolto] Macro per cancellare righe tabella
[Risolto] Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
ovviamente devi adeguare la riga
if left(oTable.getCellByName("B" & n).getString(),1) = "<" then
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
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
Re: Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
Adeguare come??patel ha scritto:ovviamente devi adeguare la riga
if left(oTable.getCellByName("B" & n).getString(),1) = "<" then
LibreOffice 7.4 Kubuntu 22.04 LTS
Re: Macro per cancellare righe tabella
nel file allegato l'ultima riga aveva una stringa che iniziava per <
devi allegare un file più realistico
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
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
Re: Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
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
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
Re: Macro per cancellare righe tabella
Funziona!!!!!
L'ho provata sul file tipo che ho allegato è funziona.
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!!!
L'ho provata sul file tipo che ho allegato è funziona.
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
Re: Macro per cancellare righe tabella
la macro calcola il numero delle righe con , 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.
Codice: Seleziona tutto
nr = oTables(i).getRows().Count
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
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
Re: Macro per cancellare righe tabella
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?
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
Re: Macro per cancellare righe tabella
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
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
Re: [Risolto] Macro per cancellare righe tabella
Sarebbe interessante vedere come sarebbe in python la macro che hai scritto
LibreOffice 7.4 Kubuntu 22.04 LTS