Podmiana wszystkich wystąpień teksu w .xlsx

0

Cześć,
Chce zastosować funkcje Replace all jaką mamy w Excelu ale za pomocą Pythona. Mam tysiące numerów w 3 kolumnach i muszę usunąć wszystko co nie jest cyfrą (spacje, interpunkcje, litery). To żeby nie robić każdego znaku ręcznie napisałem taki kod:

from openpyxl import load_workbook
y = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','"',"'",'#','$','%','&',',','(',')','*','+','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`','{','|','}','~']
wb = load_workbook('Before.xlsx')
ws = wb.active

for r in range(2,ws.max_row+1):
    for c in range(7,9):
        s = str(ws.cell(r,c).value)
        if s != None:
            for nic in y:
                (ws.cell(r,c).value) = s.replace(nic,"") 
wb.save(filename = 'After.xlsx')
print('The End!')

I najlepsze jest to że program się normalnie odpali i wyłączy bez żadnego errora, stworzy plik o nazwie After.xlsx ale nic w nim nie zrobi. Nie usunął mi tych znaków. Co mogę poprawić ?

1

Znalezione w necie:

import openpyxl
from openpyxl.utils.cell import get_column_letter

wb = openpyxl.load_workbook('/home/vanx/Documents/example1.xlsx')
wb.sheetnames
sheet = wb["Test"]
number_rows = sheet.max_row
number_columns = sheet.max_column

replacement = {'1':True, '0':False}


for i in range(number_columns):
    for k in range(number_rows):
        cell = str(sheet[get_column_letter(i+1)+str(k+1)].value)
        for key in replacement.keys():
            if str(cell) == key:
                newCell = replacement.get(key)
                sheet[get_column_letter(i+1)+str(k+1)] = str(newCell)

wb.save('example1.xlsx')
0

Przerobiłem kod:

from openpyxl import load_workbook
from openpyxl.utils.cell import get_column_letter

print("Let's start!")
wb = load_workbook('MEC.xlsx')
ws = wb.active
#y = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','"',"'",'#','$','%','&',',','(',')','*','+','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`','{','|','}','~']

replacement = {'1':True, '0':False}

for i in range(7,9):
    for k in range(2,ws.max_row+1):
        cell = str(ws[get_column_letter(i)+str(k)].value)
        for key in replacement.keys():
            if str(cell) == key:
                newCell = replacement.get(key)
                ws[get_column_letter(i)+str(k)] = str(newCell)

wb.save(filename = 'final.xlsx')
print('The End!')

nic sie nie zmieniło. Ogólnie nie wiem co robi replacement i jak mam tam wrzucić swoje znaki

1
from openpyxl import load_workbook
from openpyxl.utils.cell import get_column_letter

print("Let's start!")
wb = load_workbook('MEC.xlsx')
ws = wb.active
y = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','"',"'",'#','$','%','&',',','(',')','*','+','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`','{','|','}','~']

for i in range(1,2):
    for k in range(1,ws.max_row+1):
        cell = str(ws[get_column_letter(i)+str(k)].value)
        for key in y:
            cell = str(cell).replace(key, '')
        ws[get_column_letter(i)+str(k)] = str(cell)

wb.save(filename = 'final.xlsx')
print('The End!')
1

Czy nie prościej zastąpić na nic każdy znak który nie jest cyfrą?
Poza tym, przecież excell ma makra, napisz macro dołącz do szablonu podłącz do przycisku na belce i masz rozwiązane za pomocą przycisku.

0

Google podpowiada link

ws.cell(row=r, column=c).value = x1

Ale to z 2015 roku... aktualnie na stronie biblioteki link jest

mycell= mysheet.cell(row=4, column=5)     
mycell='Writing data to E4'

# albo 
cellref=mysheet.cell(row=i, column=5)
cellref.value=lista[i]

Troszkę bałagan tam chyba mają...

A tutaj: https://openpyxl.readthedocs.io/en/latest/tutorial.html

ws['A4'] = 4
d = ws.cell(row=4, column=2, value=10)
1

Przeciez mu dalem gotowy kod ktory dziala na bazie tego co zrobil i co chcial

0

Dzięki, działa. Myślałem o makro ale to jest jeden z etapów złożonego procesu czyszczenia listy w Excelu i to się będzie powtarzać na różnych plikach. Wykupiłem sobie kurs VBA na Udemy ale jeszcze z niego nie skorzystałem. Dzisiaj zaczne coś sobie kombinować bo zastanawia mnie czy jak napisze kod i dodam przycisk to czy będę mógł później w innych plikach Excela przywoływać ten kod razem z przyciskiem. Jeśli tak to może faktycznie przerzucę się na VBA i każdy kolejny proces będzie pod jakimś przyciskiem który będę mógł za każdym razem sobie przywołać :)

0

Z doświadczenia ci powiem ze Python jest o niebo bardziej uniwersalny, lepiej płatny i przyjemniejszy niż vba. Jak masz opcje nauki to lepiej Python niz vba

0
woolfik napisał(a):

Z doświadczenia ci powiem ze Python jest o niebo bardziej uniwersalny, lepiej płatny i przyjemniejszy niż vba. Jak masz opcje nauki to lepiej Python niz vba

Właśnie zawiodłem się na Pythonie jak zrobiłem program do vlookupa. Excel z którego pobierał mi wartość miał ok półmiliona rekordów i strasznie wolno to szło a w VBA raz dwa i gotowe

47
Paweł Gerc napisał(a):
woolfik napisał(a):

Z doświadczenia ci powiem ze Python jest o niebo bardziej uniwersalny, lepiej płatny i przyjemniejszy niż vba. Jak masz opcje nauki to lepiej Python niz vba

Właśnie zawiodłem się na Pythonie jak zrobiłem program do vlookupa. Excel z którego pobierał mi wartość miał ok półmiliona rekordów i strasznie wolno to szło a w VBA raz dwa i gotowe

Od takich rzeczy jest chociażby spark a w tym przypadku pyspark :P No i tak jak @woolfik mówi - W VBA raczej słabo z praca.

0
ledi12 napisał(a):
Paweł Gerc napisał(a):
woolfik napisał(a):

Z doświadczenia ci powiem ze Python jest o niebo bardziej uniwersalny, lepiej płatny i przyjemniejszy niż vba. Jak masz opcje nauki to lepiej Python niz vba

Właśnie zawiodłem się na Pythonie jak zrobiłem program do vlookupa. Excel z którego pobierał mi wartość miał ok półmiliona rekordów i strasznie wolno to szło a w VBA raz dwa i gotowe

Od takich rzeczy jest chociażby spark a w tym przypadku pyspark :P No i tak jak @woolfik mówi - W VBA raczej słabo z praca.

Matko kochana, że ja wcześniej o tym nie wiedziałem, zawsze myślałem że VBA jest dla Excela o wiele lepszy niż Python bo jest szybszy. Jeśli chodzi o prace to ja mam taką gdzie przyda się coś zautomatyzować i zawsze w Pythonie to robiłem i nie prędko ją będę zminiał bo na razie się rozwijam. Od nie dawna interesuje mnie VBA własnie ze względu na prędkość w Excelu, ale jak mówicie że szkoda czasu na nauka VBA bo potem pieniedzy z tego nie ma to może warto w Javie albo C takie automatyzacje zacząć robić

1 użytkowników online, w tym zalogowanych: 0, gości: 1