Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
discount 30 + hiring
Avatar
Dodo CSharp
Člen
Avatar
Dodo CSharp:14.3.2020 11:51

Ahojte,

robím automatizáciu v python pomocou pyautogui a openpyxl. Ide o automatické zaúčtovanie faktúr zo súboru *.xlsx. Automatizáciu z excelu som už robil ale vždy išlo o jednookennú záležitosť. V tomto programe (finančnom softvére) treba vytvoriť hlavičku faktúry a potom následne kliknúť na druhú záložku a pridať samostatne riadky faktúry. Excel dokument obsahuje zhruba 50 faktúr, každá v jednom riadku. Na začiatku sú údaje o hlavičke a potom dva riadky faktúry, tu Vám ukážem dátovú štruktúru,toto nie je realita je to len pre vizuálne predstavenie:
stĺpce ABCD predstavuju hlavičku,za ňou EFG je prvý riadok aHIJ druhý to sa opakuje v celom zošite

A B C D E F G H
1 číslo FA var.symb splatnosť vystavenie Stredisko Suma IBAN Stredisko

Pre zložitosť programu som si do excelu vložil špeciálne znaky, akési delimitery, napríklad na prázdnych poliach mám "{", na ukončenie hlavičky a prekliknutie karty na riadky faktúry je "/", na zadanie nového riadku faktúry "*", na konci každého riadku "|" a na konci dokumentu "end"

Avšak mám problém, údaje mi to sype OK , hlavičku to vytvorí no potom akoby to malo nejaký zádrhel v IF, lebo nereaguje to na kód dolenižšie, akoby si nevšímal tie delimitery a dokonca ani samotné "or" a pokračuje v loope.... neviem či ho mám urobiť nejako vnorený ten if, alebo má byť iná štruktúra keď to idem robiť takto zložito, skúšal som viac variant ale vždy tam niečo vadilo. Osobne mi príde, akoby v tomto zápise bral if len prvú podmienku a ostatné ignoroval. Vie mi niekto pomôcť, možno robím školácku chybu, Ďakujem

def loop_excel_sheet():
    for i in range(1, max_row+1):
        for j in range(1, max_column+1):
            cell_obj = sheet.cell(row=i, column=j)
            pyautogui.typewrite(str(cell_obj.value))
            if cell_obj.value != "|" or cell_obj.value !="CR" or cell_obj.value !="{" or cell_obj.value !="*":
                pyautogui.hotkey('tab')
                pyautogui.sleep(1)
            elif cell_obj.value == "{":
                pyautogui.sleep(2)
                pyautogui.write('')
                pyautogui.hotkey('tab')
                pyautogui.sleep(2)
            elif cell_obj.value == "CR":
                pyautogui.sleep(2)
                create_row()
            elif cell_obj.value == "*":
                pyautogui.sleep(3)
                pyautogui.hotkey('f4')
                pyautogui.sleep(4)
            elif cell_obj.value == "end":
                break
            else:
                import_data()

Zkusil jsem:

def loop_excel_sheet():
    for i in range(1, max_row+1):
        for j in range(1, max_column+1):
            cell_obj = sheet.cell(row=i, column=j)
            pyautogui.typewrite(str(cell_obj.value))
            if cell_obj.value != "|" :
                pyautogui.hotkey('tab')
                pyautogui.sleep(1)
                if cell_obj.value == "|":
                    import_data()
                elif cell_obj.value == "end":
                    break
                elif cell_obj.value != "CR" or cell_obj.value != "*" or cell_obj.value != "{":
                    pyautogui.hotkey('tab')
                    pyautogui.sleep(1)
                elif cell_obj.value == "{":
                    pyautogui.sleep(2)
                    pyautogui.write('')
                    pyautogui.hotkey('tab')
                    pyautogui.sleep(2)
                elif cell_obj.value == "CR":
                    pyautogui.sleep(2)
                    create_row()
                elif cell_obj.value == "*":
                    pyautogui.sleep(3)
                    pyautogui.hotkey('f4')
                    pyautogui.sleep(4)

+hladal som aj na reddite a stacku

Chci docílit: opravenie if a dosiahnutiu plynulého importu dát

 
Odpovědět
14.3.2020 11:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:14.3.2020 20:04
cell_obj.value != "|" or cell_obj.value !="CR" or cell_obj.value !="{" or cell_obj.value !="*"
//cell_obj.value not in ["|" , "CR", "{", "*"]

No, ale tou podminkou rikas, pouzij na jakoukoliv value krome jmenovaneho. end tam treba vubec nemas, presto se dole na nej ptas elifem.

elif cell_obj.value == "end":

A ten druhy kod nechapu. python nepouziva begin end, misto toho pouziva odsazeni zleva.

  if cell_obj.value != "|" :
                pyautogui.hotkey('tab')
                pyautogui.sleep(1)
                if cell_obj.value == "|":
                    import_data()
                elif cell_obj.value == "end":
                    break
                elif
---
if cell_obj.value != "|" :
  BEGIN
    // value tedy v zadnem pripade neni "|"
    if cell_obj.value == "|": // ??? tak, jak ji muzes porovnavat s |
    ...
  END

Nechces radeji misto ifu zacit pouzivat obdobu switch? Nebo in / not in list?
Ale, kupodivu, v druhem kodu, mas "end" nahore, tentokrat nebude ignorovany.

>>> def zero():
        return 'zero'
>>> def one():
        return 'one'
>>> def indirect(i):
        switcher={
                0:zero,
                1:one,
                2:lambda:'two'
                }
        func=switcher.get(i,lambda :'Invalid')
        return func()
>>> indirect(4)
 
Nahoru Odpovědět
14.3.2020 20:04
Avatar
Dodo CSharp
Člen
Avatar
Odpovídá na Peter Mlich
Dodo CSharp:15.3.2020 8:52

no tým IFom chcem docieliť aby Tab preskakoval textboxy len v prípade že sa obsah bunky nerovná "{" "*" "|". V prípade ak narazí na delimiter, chcem aby zastavil a vykonal akciu, teda buď prešiel na iné okno a vytvoril riadky, alebo čo už daný delimiter vykonáva. Ide o to aby ten IF na jednu stranu podporil loop a prebiehalo importovanie dát a tab preskakoval textboxy, ale na druhú stranu aby limitoval špeciálne znaky v tabulke a vykonal pri nich blok kódu im prislúchajúci

 
Nahoru Odpovědět
15.3.2020 8:52
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.3.2020 10:02

Stale tak uplne nechapu. Muzes udelat obrazek takove faktury a co s ni chces provest? Pripadne tam treba cervene zakrouzkovat ty spesl znaky. Nejsem pythonista, tak uplne nevim, co ktera tva nebo python funkce ci gui dela.

Pises, ze ten fi to nejak preskakuje, to nedava smysl. Zkusim popsat, co si myslim, ze to dela...

            cell_obj = sheet.cell(row=i, column=j) # excel bunka [radek=i, sloupec=j]
            v = str(cell_obj.value) # vyber value z bunky a preved na str; schazi mi tam trim; a totez value bych pouzil do tvych podminek, ktere pracuji se stringem
            pyautogui.typewrite(v) # zapis value do pyautogui, at uz je to cokoliv, ocekaval bych tam jeste nejake trim
            if v != "|" or v !="CR" or v !="{" or v !="*": # pokud v neni jedno z | CR { *, tak proved toto
                pyautogui.hotkey('tab') # spust funkci hotkey=tab
                pyautogui.sleep(1) # nechapu, k cemu je to dobre
# cili, jestli to spravne chapu, kdyz narazi na 1 z tech 4 znaku, tak to to provede keypress v tom
# gui. A mozna proto jsou tam ty sleepy. A ty by meli byt ale spis po te keypress, pred ni mi to
# nedava smysl.
# 2. Navic, je sleep(1) dostacujici? Ono, zmacknuti klavesy chvili trva a tusim jsem
# nekde videl pouzivat 30-50ms
# 3. a proc pouzivas zmacknuti klavesy a ne primy zapis pres pyautogui.typewrite(v)  ?
# Tam zadny sleep nemas. Takze by to melo byt asi spravnejsi.
# google = pyautogui.typewrite tabelator
# https://www.programcreek.com/python/example/103343/pyautogui.typewrite
# pyautogui.typewrite('\n') new line
# pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=secs_between_keys)
#     pyautogui.hotkey('ctrl', 'c')  # ctrl-c to copy on v tom kodu sleep nepouziva
#    pyautogui.hotkey('ctrl', 'v')  # ctrl-v to paste
# pyautogui.typewrite('\t') # tab
# v jine casti kodu zase pouziva sleep, nejspis zamerne, ale pro import asi nic takoveho nepotrebujes
# pyautogui.press('f12')
#    time.sleep(1)
#    pyautogui.hotkey('ctrl','i')
#    time.sleep(0.5)

elif
#nebo proved dalsi kod...
             v == "{":
if cell_obj.value != "|" :
    pyautogui.hotkey('tab')
    pyautogui.sleep(1)
    if cell_obj.value == "|":
        import_data()
    elif cell_obj.value == "end":
        break
    elif cell_obj.value != "CR" or cell_obj.value != "*" or cell_obj.value != "{":
        pyautogui.hotkey('tab')
        pyautogui.sleep(1)
    elif cell_obj.value == "{":
        pyautogui.sleep(2)
        pyautogui.write('')
        pyautogui.hotkey('tab')
        pyautogui.sleep(2)
    elif cell_obj.value == "CR":
        pyautogui.sleep(2)
        create_row()
    elif cell_obj.value == "*":
        pyautogui.sleep(3)
        pyautogui.hotkey('f4')
        pyautogui.sleep(4)

pyautogui.sleep(2)
pyautogui.write('')
pyautogui.hot­key('tab')
pyautogui.sleep(2)
elif v == "CR":
pyautogui.sleep(2)
create_row()
elif v == "":
pyautogui.sleep(3)
pyautogui.hot­key('f4')
pyautogui.sleep(4)
### elif cell_obj.value == "end": # toto se nevykona, protoze podminka s or neobsahuje v!=end
# pokud v==end, pak se spusti prvni z podminek v != "|" or v !="CR" or v !="{" or v !="
"
# a zadna dalsi, ktera je ve stejne serii if-elif-else se uz nevykona, pokud o neni jeden z tech 4 znaku.
# cili tenhle kod klidne muzes zakomentovat krizkem a nic se nestane
### break
else:
import_data() # a toto se vykona vzdy, pokud v neni jedno z | CR { *
# Pokud ti to nefunguje, tak je neco spatne. Tezko rici, co, zda je problem s tim gui nebo s importem dat

\---


            cell_obj = sheet.cell(row=i, column=j)
            pyautogui.typewrite(str(cell_obj.value))
            if cell_obj.value != "|" : #jakykoliv znak krome | spusti kod uvnitr ifu
                pyautogui.hotkey('tab')
                pyautogui.sleep(1)
#                if cell_obj.value == "|": # ignoruje, tento znak je vyloucen prvnim ifem, preci, muzes zakomentova
#                    import_data()
#                elif cell_obj.value == "end": #ok
                if cell_obj.value == "end": #ok
                    break
                elif cell_obj.value != "CR" or cell_obj.value != "*" or cell_obj.value != "{": #ok
                    pyautogui.hotkey('tab')
                    pyautogui.sleep(1)
                elif cell_obj.value == "{": # ok
                    pyautogui.sleep(2)
                    pyautogui.write('')
                    pyautogui.hotkey('tab')
                    pyautogui.sleep(2)
                elif cell_obj.value == "CR":# ok
                    pyautogui.sleep(2)
                    create_row()
                elif cell_obj.value == "*": # ok
                    pyautogui.sleep(3)
                    pyautogui.hotkey('f4')
                    pyautogui.sleep(4)

Nerozumim, ceho chces presne docilit. Zo znamena import dat? Te funkci nepredavas zadne hodnoty.
Chces docilit toho, ze kdyz znak neni zadny z tvych spesl znaku, tak ma vzdy spustit import? cili, odfiltrovat tve znaky z kodu. Tak v tom prvnim kodu mel byt import napsany uvnitr tohoto ifu
elif cell_obj.value != "CR" or cell_obj.value != "*" or cell_obj.value != "{":
Nebo, jestli tam mas nejakou sekveci spesl kod begin, prikazy, end, tak to bys musel napsat uplne jinak

# {cr} {end} {*} {|}
if znak=='{':
    special=true
if special==true: # vykonej, jenom, kdyz je special true
    if znak=='}':
        special=false
    elif znak=='cr': ...
    elif znak=='end': ...
else: # a kdyz neni, tak proved import
    import()
 
Nahoru Odpovědět
15.3.2020 10:02
Avatar
Dodo CSharp
Člen
Avatar
Odpovídá na Peter Mlich
Dodo CSharp:15.3.2020 11:18
def loop_excel_sheet():
    for i in range(1, max_row+1):
        for j in range(1, max_column+1):
            cell_obj = sheet.cell(row=i, column=j)
            pyautogui.typewrite(str(cell_obj.value))
            pyautogui.sleep(1)
            if cell_obj.value == "end":
                break
            elif cell_obj.value == "|":
                pyautogui.write('')
                import_data()
                pyautogui.sleep(3)
            elif cell_obj.value == "{": #preskočí prázdne textboxy
                pyautogui.sleep(2)
                pyautogui.write('')
                pyautogui.hotkey('tab')
                pyautogui.sleep(2)
            elif cell_obj.value == "CR":
                pyautogui.write('')
                pyautogui.sleep(2)
                create_row()    #funkcia vytvorená na ukončenie hlavičky vytvorenie prvého riadku
            elif cell_obj.value == "*":
                pyautogui.sleep(3)
                pyautogui.write('')
                pyautogui.hotkey('f4') #f4 vytvorí ďalší riadok faktúry
                pyautogui.sleep(4)
            else:
                pyautogui.hotkey('tab')
                pyautogui.sleep(1)

nakoniec som to upravil takto, a ide to ako má tých vela podmienok som zahrnul do else aby sa to na začiatku neprekrývalo

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
15.3.2020 11:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.