Αντρω δι Νεξυνω

[Python] Documenti writer (*.otd - L.O./O.O) come template

« Older   Newer »
  Share  
nuzzopippo
view post Posted on 8/3/2020, 09:05 by: nuzzopippo
Avatar

Nubbio x Sempre

Group:
Moderazione globale
Posts:
7,226

Status:


Una precisazione



Giacché 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)
 
Web  Top
2 replies since 23/2/2020, 12:13   106 views
  Share