Information om denne video
Underviser: Simon Rotendahl Video: 10:21 Lektion nr. 23 af 27
Opdatere timeseddel
Det her er vores anden video i eventyret om Python og Microsoft Excel. Vi er ved at være i slutningen af kurset, så projektet her, inkorporere også mange koncepter fra tidligere, while løkker, betinget udtryk osv. Så det bliver en svær video, men meget lærings-fyldt.
Vi vil her i videoen bruger Python til at opdatere en timeseddel, ved at lægge alle timer, fra dags dato til sidste opdatering, sammen, og skrive det ind i excel arket. Husk at stille spørgsmål, og se de tidligere videoer, hvis det er noget der ikke giver mening.
I næste video afslutter vi Excel.
Hej Simon,
Jeg har et problem i videoen inden vi begynder at ligge todate = fromdate
jeg ved ikke om du kan hjælpe, jeg har lagt kode og terminal error i kommentar
import openpyxl as xl
import datetime as dt
wb = xl.load_workbook(‘timeseddel.xlsx’)
sheet = wb[wb.sheetnames[0]]
today = dt.datetime.today()
fromDate = 2
while today.date() != dt.datetime.date(sheet.cell(column=1, row=fromDate).value):
fromDate +=1
print(today.date())
wb.save(‘timeseddel2.xlsx’)
ERROR FROM TERMINAL ->
PS C:\Users\Tobias\Desktop> & C:/Users/Tobias/AppData/Local/Programs/Python/Python313/python.exe c:/Users/Tobias/Desktop/Intro-video.py
Traceback (most recent call last):
File “c:\Users\Tobias\Desktop\Intro-video.py”, line 15, in
while today.date() != dt.datetime.date(sheet.cell(column=1, row=fromDate).value):
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: descriptor ‘date’ for ‘datetime.datetime’ objects doesn’t apply to a ‘NoneType’ object
PS C:\Users\Tobias\Desktop>
Jeg fortsætte lidt i næste video, jeg har dog stadig fejlen som gør det svært at fortsætte, jeg må prøve mig frem imorgen med stackoverflow eller GTP ;)
Opdatering, dagen derpå kan jeg ikke få det til at virke, jeg så dit svar længere nede, men det virkede heller ikke
Hej Tobias,
Som du siger, så lyder det lidt som samme problem som de andre, for at fejlfinde så ville jeg prøve at smide et print ind i while løkken, det vil fortælle dig datoen lige før det går galt. Hvis det ikke hjælper dig med at løse problemet så skriv lige igen, så kigger jeg på det igen :)
while today.date() != dt.datetime.date(sheet.cell(column=1, row=fromDate).value):
print(dt.datetime.date(sheet.cell(column=1, row=fromDate).value))
fromDate +=1
Hej Simon
Når jeg bruger denne linje:
while (dt.datetime.date(sheet.cell(column=1, row=fromDate).value) is not None) and (today.date() != dt.datetime.date(sheet.cell(column=1, row=fromDate).value)):
får jeg denne fejl:
TypeError: descriptor ‘date’ for ‘datetime.datetime’ objects doesn’t apply to a ‘NoneType’ object
Hvad gør man så?
alt det bedste
Stig
Hej Stig,
Det er lidt svært for mig at sige uden at have hele koden, så vil du prøve at kopiere hele din python fil, sætte den ind på siden herunder, trykke “Create new paste”, og så sende mig linket til den side :)
https://pastebin.com/
Mvh.
Simon
Hej Simon.
Adressen er pastbin.com/jGW8qyDA
VH.
Stig
Hej Stig,
Det virker til at være samme problem som Jessie stødte ind i. Altså at datoen ikke findes i arket. Jeg har bygget et eksempel her til dig, med din kode, men med et ark som har datoer til slutningen af 2020, så kan du prøve det ved at trykke “Run” i toppen. :)
https://repl.it/@Rotendahl/Eksempel-til-Stig
Mvh.
Simon
Det kan også være at mit svar til Jessies spørgsmål herunder kan hjælpe, i tilfælde af at du ikke har set det. Hvis det ikke hjælper så sender du mig bare koden med pastebin linket :)
Hej Simon.
Når jeg forsøger at kører programmet får jeg denne fejl:
File “.\23 Opdater data i Excel.py”, line 15, in
while today.date() != dt.datetime.date(sheet.cell(column=1, row=fromDate).value):
TypeError: descriptor ‘date’ for ‘datetime.datetime’ objects doesn’t apply to a ‘NoneType’ object
Jeg tænker selv at det har noget med datoerne at gøre, altså at der ikke er nogen datotype for dagen idag, da excel arket kun fortsætter til dato: 31.12.2018.
Hvad i alverden skal jeg gøre her?
På forhånd tak.
Venlig hilsen Jessie Winther Nielsen
Hej Jessie,
Det er godt spottet det er nemlig problemet til en hvis grad. Specifikt er problemet at når vi skriver ‘sheet.cell(column=1, row=fromDate).value’ så henter vi den værdi der ligger i cellen, hvis der ikke ligger noget i cellen (som når datoen i dag, er senere end datoen i arket) så er sheet.cell(column=1, row=fromDate).value = None, altså vi får en værdi som har typen None tilbage og ikke et datetime.datetime object.
For at fikse det er der en nem måde, vi ændre linjen til
while (dt.datetime.date(sheet.cell(column=1, row=fromDate).value) is not None) and (today.date() != dt.datetime.date(sheet.cell(column=1, row=fromDate).value)):
Så nu har vores while løkke to betingelser
1. At cellen ikke må være tom, altså at, hvilket er den første del i den nye linje (før and), for når vi skriver “etEllerAndet is not None” så giver det True hvis etEllerAndet ikke er None, og det giver False hvis det er None
2. Betingelsen fra før med at i dag ikke er den dato vi er nået til
and siger så at både betingelse 1 og betingelse 2 skal være sand for at vi fortsætter i løkken, så nu vil løkken stoppe hvis den enten møder en dato som er samme dato som i dag, eller hvis den møder en tom celle.
Jeg håber det hjalp ellers må du sige til :)