Importare fatture elettroniche XML in excel
Importare fatture elettroniche XML in excel
Con questo semplice programma in Python per importare fatture elettroniche in excel possiamo decidere i campi da importare e la cartella da elaborare.
Il programma scorre tutti i file XML contenuti nella cartella e genera un file CSV (apribile da Excel) con tutti i dati che ci interessano.
Un semplice programma in Python
Nel programma indichiamo in una lista di Python una serie di Tuple (coppie di valori) contenenti l’elemento padre del file XML e il singolo elemento con il dato di nostro interesse.
Non è l’implementazione migliore della libreria eTree ma funziona egregiamente per il nostro scopo ed è un ottimo esempio di utilizzo di Liste, Tuple, Cicli, scrittura di stringhe e accesso ai file in Python.
Se siete totalmente digiuni di Python ecco i passi per poterlo utilizzare:
Scaricate l’ultima versione di Python (il programma è testato con la versione 3.7 per windows) da:
https://www.python.org/downloads/
Una volta eseguita l’installazione potete creare un file nella stessa cartella di installazione di Python (nel nostro esempio C:\PYTHON37).
Chiamiamo questo file: exportFatture.py e incolliamoci il codice riportato in fondo a questo articolo avendo cura di cambiare solo il percorso dove andremo a mettere i nostri file di fatture in formato XML.
Nel codice in questione sono anche indicati, a titolo d’esempio, i campi da esportare.
Dopodichè accediamo alla console di comando (tasto destro sul pulsante start di Windows e selezioniamo Esegui).
Digitiamo il comando:cmd e premiamo invio.
Dopodichè possiamo scrivere: cd \python37 (o il nostro percorso d’installazione)
Infine possiamo eseguire:python esportFatture.py
L’output in formato CSV
Alla fine dell’elaborazione avremo i campi interessati esportati in formato .csv che potremo aprire con Excel.
Sperando di aver fatto cosa gradita a coloro che abbiano questa necessità vi invitiamo come sempre a lasciare un commento o contattarci attraverso l’apposito form del nostro sito.
### semplice programma in Python per importare fatture elettroniche in excel import os,glob import xml.etree.ElementTree as ET DatiFatture = [] ###Qui indichiamo in coppie (tuple) il dato che ci serve e l'elemento all'interno del quale è contenuto. StrutturaCampi = [ ('CessionarioCommittente','Denominazione'), ('DatiGenerali','ImportoTotaleDocumento'), ('DatiPagamento','DataScadenzaPagamento') ] ### Qui indichiamo la certella con i file XML da elaborare path = "C:\\Users\\user\\Desktop\\FattureXML" for filename in glob.glob(os.path.join(path, "*.xml")): tree = ET.parse(filename) root = tree.getroot() pre = False i = 0 e = ET.ElementTree(tree) for elt in e.iter(): if elt.tag == StrutturaCampi[i][0]: pre = True if elt.tag == StrutturaCampi[i][1] and pre: DatiFatture.append((elt.tag,elt.text)) print (("%s: '%s'") % (elt.tag, elt.text)) pre = False i= i +1 if i == len(StrutturaCampi): i = 0 ### Il file si chiamerà: export.csv e sarà nella stessa cartella di input out_file = open(os.path.join(path, "export.csv"),"w") for NomeCampo in StrutturaCampi: out_file.write('%s;'%(str(NomeCampo[1]))) out_file.write('\n') i = 0 for TupleValues in DatiFatture: out_file.write('%s;'%(TupleValues[1])) i = i +1 if i == len(StrutturaCampi): i = 0 out_file.write('\n') out_file.close()
Per chi fosse interessato ho pubblicato qui un modo per leggere le righe di dettaglio della fattura utilizzando la libreria xmltodict.
Buongiorno,
ho provato ad utilizzare la routine aggiornando solo il percorso file ma senza successo.
Mi spiego. Ho messo in una stessa cartella due file XML di input e il csv di output.
La prima riga del CSV viene correttamente inizializzata con in nomi dei campi (io ne ho aggiunto un ulteriore che è presente in uno dei due file xml) a riprova questa che il percorso è corretto.
La routine però non sembranon entrare nel ciclo, come se non trovasse i file XML di input.
Ho messo un “print” tra le istruzioni che seguono che però non viene eseguito, in consolle non appare niente.
pre = False
i = 0
e = ET.ElementTree(tree)
print (“sono passato di qua”)
Può darmi una mano
Grazie
Francesco
Buongiorno Francesco, ho visto solo ora il commento!
Se ha ancora la necessita posti pure il codice completo con il percorso e nomefile che ha utilizzato.
### semplice programma in Python per importare fatture elettroniche in excel
import os,glob
import xml.etree.ElementTree as ET
DatiFatture = []
###Qui indichiamo in coppie (tuple) il dato che ci serve e l’elemento all’interno del quale è contenuto.
StrutturaCampi = [
(‘CessionarioCommittente’,’Denominazione’),
(‘DatiGenerali’,’ImportoTotaleDocumento’),
(‘DatiPagamento’,’DataScadenzaPagamento’),
(‘ns3:MetadatiInvioFile’,’IdentificativoSdI’)
]
### Qui indichiamo la certella con i file XML da elaborare
path = “C:\\Users\\Imma\\Desktop\\ProvaXML\\FattureXML”
### Istruzioni per il DEBUG
### import pdb
### pdb.set_trace ()
for filename in glob.glob(os.path.join(path, “*.xml”)):
tree = ET.parse(filename)
root = tree.getroot()
pre = False
i = 0
e = ET.ElementTree(tree)
print (“sono passato di qua”)
for elt in e.iter():
if elt.tag == StrutturaCampi[i][0]:
print (“sono passato di qua2”)
pre = True
if elt.tag == StrutturaCampi[i][1] and pre:
DatiFatture.append((elt.tag,elt.text))
print ((“%s: ‘%s'”) % (elt.tag, elt.text))
pre = False
i= i +1
print (i)
if i == len(StrutturaCampi):
i = 0
### Il file si chiamerà: export.csv e sarà nella stessa cartella di input
out_file = open(os.path.join(path, “export.csv”),”w”)
for NomeCampo in StrutturaCampi:
out_file.write(‘%s;’%(str(NomeCampo[1])))
out_file.write(‘\n’)
i = 0
for TupleValues in DatiFatture:
out_file.write(‘%s;’%(TupleValues[1]))
i = i +1
if i == len(StrutturaCampi):
i = 0
out_file.write(‘\n’)
out_file.close()
QUESTO INVECE IL FILE XML DI INPUT
–
108700191
IT00514610559_70.xml.p7m
9BTGYX
FPA12
1
916674989
Ciao, ma volendo leggere tutte le voci dei vari articoli che compongono la fattura, con i loro prezzi e iva, per poter fare dei conti in excel in un secondo momento, come devo modificare il codice?
grazie mille
Principalmente bisogna aggiungere i campi alla lista:
StrutturaCampi = [
(‘CessionarioCommittente’,’Denominazione’),
(‘DatiGenerali’,’ImportoTotaleDocumento’),
(‘DatiPagamento’,’DataScadenzaPagamento’)
]
Però per i campi di dettaglio righe fattura è necessario fare un altro sotto ciclo che scorra le righe che la compongono fino alla fine.
Se riesco nei prossimi giorni carico un esempio.A presto!
grazie mille!!
Si effettivamente poter esportare tutte le righe delle fatture a excel da un gruppo di xml sarebbe fantastico in modo da avere per ogni riga: codice cliente/partivaiva/cod.fiscale, nome cliente, n. fattura , data fattura, cod. articolo, descrizione articolo, quantità, prezzo, sconto, lotto
Esattamente quello che cerco di fare, caricare il magazzino dalle fatture xml. Qualcuno ha già scritto il codice?
Ma legge anche i files firmati p7m ?
Non l’ho testato ma dovrebbe farlo.
Per chi fosse interessato ho pubblicato qui un modo per leggere le righe con la libreia xmltodict:
https://robertozanardo.com/blog/2020/08/13/leggere-dettaglio-linee-da-fatture-elettroniche-con-xmltodict/
Qui invece il programma già fatto:
https://robertozanardo.com/prodotto/fexplore-per-windows-esporta-xml-fatture-elettroniche-in-csv-per-excel/
mi potete aiutare per favore
non estrae nulla..
### semplice programma in Python per importare fatture elettroniche in excel
import os,glob
import xml.etree.ElementTree as ET
DatiFatture = []
###Qui indichiamo in coppie (tuple) il dato che ci serve e l’elemento all’interno del quale è contenuto.
StrutturaCampi = [
(‘CessionarioCommittente’,’Denominazione’),
(‘DatiGenerali’,’ImportoTotaleDocumento’),
(‘DatiPagamento’,’DataScadenzaPagamento’)
]
### Qui indichiamo la certella con i file XML da elaborare
path = “C:\\Python\\FattureXML\\”
for filename in glob.glob(os.path.join(path, “*.xml”)):
tree = ET.parse(filename)
root = tree.getroot()
pre = False
i = 0
e = ET.ElementTree(tree)
for elt in e.iter():
if elt.tag == StrutturaCampi[i][0]:
pre = True
if elt.tag == StrutturaCampi[i][1] and pre:
DatiFatture.append((elt.tag,elt.text))
print ((“%s: ‘%s'”) % (elt.tag, elt.text))
pre = False
i= i +1
if i == len(StrutturaCampi):
i = 0
### Il file si chiamerà: export.csv e sarà nella stessa cartella di input
out_file = open(os.path.join(path, “export.csv”),”w”)
for NomeCampo in StrutturaCampi:
out_file.write(‘%s;’%(str(NomeCampo[1])))
out_file.write(‘\n’)
i = 0
for TupleValues in DatiFatture:
out_file.write(‘%s;’%(TupleValues[1]))
i = i +1
if i == len(StrutturaCampi):
i = 0
out_file.write(‘\n’)
out_file.close()
cosa sbaglio?
grazie