| Una precisazioneGiacché ho visto qualcuno leggere questo post (pochi in verità. ma è discorso di nicchia) ci tengo a rammentare che qui scrivo appunti per mio promemoria e, ovviamente, ci scrivo cose che ritengo utile rammentare. Preciso quanto segue al fine di non dare "esempi" fuorvianti. Il secondo post, quello dello inserimento tabellare, in realtà non necessita minimamente di effettuare un "copia" della tabella di riferimento, ho fatto così perché mi interessava preservare gli accorgimenti trovati per copiare celle multi-riga/multi-colonna. Può essere manipolata direttamente la tabella originaria compilando la prima riga ed inserendo le ulteriori righe dati necessarie prima della riga di riepilogo delle somme. Le tecniche sono fondamentalmente le stesse, non le ri-spiegherò, un esempio di manipolazione diretta, derivato dal precedente, è questo : CODICE # -*- coding: utf-8 -*-
# Variante a "manipolazione diretta" della tabella di riferimento
from odf import opendocument as od from odf import table, text from odf.element import Text from odf.text import P import sys import os
# definizione dei valori da inserire nel template values = {} values['anno'] = 2019 values['totale'] = 0.0
# definizione righe dati tabella rows_value = [[None, 1, 1, None, 150000.0, None], [None, 2, 2, None, 180000.0, None], [None, 3, None, None, 48741.90, 'D.D.S. 075/16 - 2019'], [None, 4, 3, None, 463537.26, 'retribuzioni'], [None, 5, 4, None, 91545.73, None], [None, 6, 5, None, 41589.8, None], [None, 7, 6, None, 382289.15, 'regolarizzazione provvisorio'], [None, 8, 7, None, 31768.8, None], [None, 9, 8, None, 430976.92, None], [None, 10, 9, None, 719914.0, 'retribuzioni'], [None, 11, 10, None, 108478.08, None], [None, 12, None, None, 500000, 'Delibera 344/2019'], [None, 13, 11, None, 130000.0, None], [None, 14, 14, None, 96295.0, 'Delibera 30/2019'], [None, 15, 15, None, 515000.0, 'Determina 25/2019'], [None, 16, None, None, 4.0, 'regolazione provvisori n.ri 2 e 7'] ]
def italy_currency(str_num): parts = str_num.split('.') blocks = len(parts[0]) // 3 lista = [x for x in parts[0]] sub_num = [] while len(lista) > 3: sub = lista[-3:] sub_num.append(sub) lista = lista[:-3] sub_num.append(lista) sub_num.reverse() sub_num = [''.join(x) for x in sub_num] return '.'.join(sub_num) + ',' + parts[1]
def edit_table(doc, table_name): template_table = None all_table = doc.getElementsByType(table.Table) for xt in all_table: if hasattr(xt, 'attributes'): tbl_name = xt.getAttribute('name') if tbl_name == table_name: e_table = xt if e_table is None: print('Template tabella non trovato') return # estrae la lista delle righe della tabella e la penultima t_rows = e_table.getElementsByType(table.TableRow) if t_rows: tr = t_rows[2] else: return # memorizza le celle originarie della riga cells = tr.getElementsByType(table.TableCell) cells_style_names = [] parag_style_names = [] for i in range(len(cells)): style_name = cells[i].getAttribute('stylename') cells_style_names.append(style_name) par = cells[i].getElementsByType(text.P) style_name = par[0].getAttribute('stylename') parag_style_names.append(style_name) # valorizza i paragrafi della riga di riferimento riga = rows_value[0] # "sistema" la riga dati da visualizzare summa = riga[4] data_row = riga[:4] + [summa] + riga[4:] for i in range(len(data_row)): if data_row[i]: curr_P = cells[i].getElementsByType(text.P)[0] if type(data_row[i]) == float: testo= '%.2f' % data_row[i] testo = italy_currency(testo) else: testo = data_row[i] curr_P.addText(text=testo) # memorizza l'ultima riga last_row = t_rows[-1] # per ogni riga di dati crea una riga nella nuova tabella for riga in rows_value[1:]: summa += riga[4] # "sistema" la riga dati da visualizzare data_row = riga[:4] + [summa] + riga[4:] # crea una nuova riga n_t_row = table.TableRow() # per ogni elemento dati crea una cella ed eventualmente un paragrafo for i in range(len(data_row)): n_cell = table.TableCell() # copia gli attributi originali n_cell.setAttribute('stylename', cells[i].getAttribute('stylename')) # stile n_cell.setAttribute('numbercolumnsspanned', cells[i].getAttribute('numbercolumnsspanned')) # estensione n_cell.setAttribute('numberrowsspanned', cells[i].getAttribute('numberrowsspanned')) n_cell.setAttribute('numbermatrixcolumnsspanned', cells[i].getAttribute('numbermatrixcolumnsspanned')) n_cell.setAttribute('numbermatrixrowsspanned', cells[i].getAttribute('numbermatrixrowsspanned')) #n_cell.setAttribute('stylename', cells_style_names[i]) # se l'elemento è valido definisce un paragrafo if data_row[i]: new_P = text.P() new_P.setAttribute('stylename',parag_style_names[i]) if type(data_row[i]) == float: testo= '%.2f' % data_row[i] testo = italy_currency(testo) else: testo = data_row[i] new_P.addText(text=testo) # aggiunge il paragrafo alla nuova cella n_cell.addElement(new_P) # aggiunge la cella alla nuova riga n_t_row.addElement(n_cell) # aggiunge la riga alla tabella last_row.parentNode.insertBefore(n_t_row, last_row) # scrive il riepilogo delle somme (inutile ma lo vogliono) dida = "Sommano i mandati" # estrae le celle dell'ultima riga lr_cells = last_row.getElementsByType(table.TableCell) # inserisce la didascalia curr_P = lr_cells[0].getElementsByType(text.P)[0] curr_P.addText(text=dida) # inserisce la somma totale testo= '%.2f' % summa testo = italy_currency(testo) curr_P = lr_cells[1].getElementsByType(text.P)[0] curr_P.addText(text=testo)
template_doc = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), 'templates/lst_mandati.odt') dest_doc = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), 'documents/test_lst_mandati.odt') table_name = 'lista_mandati'
orig_doc = od.load(template_doc) edit_table(orig_doc, table_name) orig_doc.write(dest_doc)
|