Lettura Fattura Elettronica

di il
5 risposte

Lettura Fattura Elettronica

Ciao a tutti,

ho iniziato a studiare python da meno di un mese, e ho deciso di sviluppare un mini progetto che devo fare. Ho tutte le fatture elettroniche salvate in una cartella del nas che comprende anceh subfolders (con il nome del fornitore), da lì devo andare a leggere e scrivere in un file excel la denominazione sociale e altre informazioni presenti nel xml.

Ho cercato su internet, e ho provato da me, ma continuo ad avere errori. Più ho meno gli stessi, ho provato sia con untangle, che con xmltodict. Avrei bisogno se possibile di qualche guida da parte vostra. Vi prego illuminatemi.

Gli errori invece sono questi:

Traceback (most recent call last):
  File\Einvoice_report\main.py", line 27, in <module>
    if __name__ == '__main__': main()
   line 22, in main
    scan_file()
   line 17, in scan_file
    obj = xmltodict.parse(fd.read())
   line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 176: character maps to <undefined>

Process finished with exit code 1

# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.

def scan_file():
    import os
    import xmltodict
    # files = []
    fdir = "PRODUCT/Account Payable/"

    for root, dirs, files in os.walk(fdir):
        for file in files:
            varpath = os.path.join(root, file)
            print(varpath)
            with open(varpath) as fd:
             obj = xmltodict.parse(fd.read())
            paese = obj['p:FatturaElettronica']['FatturaElettronicaHeader']['DatiTrasmissione']['IdTrasmittente']['IdPaese']


def main():
    scan_file()
# Press the green button in the gutter to run the script.


# print("File one __name__ is set to: {}" .format(__name__))
if __name__ == '__main__': main()

5 Risposte

  • Re: Lettura Fattura Elettronica

    Ciao a tutti,

    ho finito vi posto il codice nel caso, abbiate bisogno
    
    def scan_file():
        import os
        import xml.etree.cElementTree as ET
        import xlsxwriter
        # files = []
        fdir = "PRODUCT\Account Payable"
    
        for root, dirs, files in os.walk(fdir):
            for file in files:
                varpath = os.path.join(root, file)
                print(varpath)
                obj = ET.ElementTree(file=varpath)
                for denomstr in obj.iterfind('FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici/Anagrafica/Denominazione'):
                    print(denomstr.text)
    
  • Re: Lettura Fattura Elettronica

    Ficiao, avevo detto ceh avevo risolto ma in realtà sono stato stupido, perchè non ho risolto un bel niente.
    ho un problema che non capisco da cosa derivi, molto probabilmente esclusivamente logico.

    come dicevo sopra, ho poggiato le fatture elettroniche in una cartella che ha delle sottocartelle divise per nome operatore e ciascuna ha le proprie fatture.
    Fin qui tutto bene, riesco anche a leggere tranquillamente il file xml importandomi l'output, il problema è un altro probabilmente più semplice ma di cui io non riesco a capire.

    Nel codice che vedete sotto, tutti print mostrano tutti i campi che dovrebbero uscire, mentre nel file excel sembra proprio saltare alcuni xml, e non riesco a capire il perchè.
    
    class xml_man:
        from datetime import date
        import xlsxwriter
        newdate = date.today()
        datestr = newdate.strftime('%m%d%y')
        strpath = f'{datestr}.xlsx'
        reinvoice = xlsxwriter.Workbook(strpath)
        worksheet = reinvoice.add_worksheet()
    
        def scan_file(self):
            import os
            import xml.etree.cElementTree as ET
            import xlsxwriter
            # files = []
            fdir = "\Account Payable"
            row = 0
            column = 0
            for root, dirs, files in os.walk(fdir):
                column = 0
                for file in files:
                    varpath = os.path.join(root, file)
                    print(varpath)
                    obj = ET.ElementTree(file=varpath)
                    for denomstr in obj.iterfind('FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici/Anagrafica/Denominazione'):
                        print(denomstr.text)
    
                    for branch in obj.iterfind('FatturaElettronicaHeader/CessionarioCommittente/DatiAnagrafici/Anagrafica/Denominazione'):
                        print(branch.text)
    
                    for comune in obj.iterfind('FatturaElettronicaHeader/CessionarioCommittente/Sede/Comune'):
                        print(comune.text)
    
                    for typedoc in obj.iterfind('FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento'):
                        print(typedoc.text)
    
                    for numedoc in obj.iterfind('FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/Numero'):
                        print(numedoc.text)
    
                    for dataedoc in obj.iterfind('FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/Data'):
                        print(dataedoc.text)
    
                    for imponibile in obj.iterfind('FatturaElettronicaBody/DatiBeniServizi/DatiRiepilogo/ImponibileImporto'):
                        print(imponibile.text)
    
                    for natura in obj.iterfind('FatturaElettronicaBody/DatiBeniServizi/DatiRiepilogo/Natura'):
                        print(natura.text)
    
                    for ivaperc in obj.iterfind('FatturaElettronicaBody/DatiBeniServizi/DatiRiepilogo/RiferimentoNormativo'):
                        print(ivaperc.text)
    
                    self.worksheet.write(row, column, denomstr.text)
                    column = column + 1
                    self.worksheet.write(row, column, branch.text)
                    column = column + 1
                    self.worksheet.write(row, column, comune.text)
                    column = column + 1
                    self.worksheet.write(row, column, typedoc.text)
                    column = column + 1
                    self.worksheet.write(row, column, numedoc.text)
                    column = column + 1
                    self.worksheet.write(row, column, dataedoc.text)
                    column = column + 1
                    self.worksheet.write(row, column, imponibile.text)
                    column = column + 1
                    self.worksheet.write(row, column, natura.text)
                    column = column + 1
                    self.worksheet.write(row, column, ivaperc.text)
                    column = column + 1
                    self.worksheet.write(row, column, varpath)
                    column = 0
    
  • Re: Lettura Fattura Elettronica

    Alla fine sto completando lo script da solo, manca solamente una cosa all'elenco.
    l'estrazione del file pdf dal xml avete qualche suggerimento?
  • Re: Lettura Fattura Elettronica

    Timer86 ha scritto:


    Nel codice che vedete sotto, tutti print mostrano tutti i campi che dovrebbero uscire, mentre nel file excel sembra proprio saltare alcuni xml, e non riesco a capire il perchè.
    Ti sarai accorto che stai cercando di inserire nel file Excel il contenuto di variabili che, durante la stampa con print(), valorizzi all'interno di un ciclo:
    
                    for branch in obj.iterfind('FatturaElettronicaHeader/CessionarioCommittente/DatiAnagrafici/Anagrafica/Denominazione'):
                        print(branch.text)
    
                    for comune in obj.iterfind('FatturaElettronicaHeader/CessionarioCommittente/Sede/Comune'):
                        print(comune.text)
    
    # ...
                    self.worksheet.write(row, column, branch.text)
                    column = column + 1
                    self.worksheet.write(row, column, comune.text)
                    column = column + 1
    
    Ovviamente, ciò non può funzionare.

    Timer86 ha scritto:


    Alla fine sto completando lo script da solo [...]
    Questa sarebbe la normalità: al netto che il forum può fornire aiuti quando possibile, il compito di realizzare lo script rimane comunque tuo.

    Timer86 ha scritto:


    manca solamente una cosa all'elenco.
    l'estrazione del file pdf dal xml avete qualche suggerimento?
    Cerca funzioni in grado di leggere il contenuto dell'elemento del file XML che contiene l'allegato: è codificato in Base64, quindi dovrai decodificarlo se vuoi ottenere i byte effettivi da scrivere per creare il documento su disco.

    Ciao!
  • Re: Lettura Fattura Elettronica

    Ciao,
    grazie. Sono riuscito facendo così, magari può essere di aiuto.
    
        def extract_pdf(name,months,years):
            # this function will extract pdf from an Invoice (if it's attached on the xml)
            import chilkat2
            import sys
            xml = chilkat2.Xml()
            success = xml.LoadXmlFile(name)
            sb = chilkat2.StringBuilder()
            success = xml.GetChildContentSb("FatturaElettronicaBody|Allegati|Attachment", sb)
            bd = chilkat2.BinData()
            success = bd.AppendEncodedSb(sb, "base64")
            ospath = os.path.basename(name)
            filesplit = os.path.splitext(ospath)[0]
            # longpath = f'F:/FTP/EINVOICE/Archive/{filesplit}-attachment.pdf'
            dirstr = f"{months}_{years}"
            longpath = f'D:/APInvoiceFTP/{dirstr}/{filesplit}-attachment.pdf'
            success = bd.WriteFile(longpath)
            return longpath
Devi accedere o registrarti per scrivere nel forum
5 risposte