NemProgrammering.dk logo

Indsæt og opdater data i Excel-ark med Python

Lær Python programmering » Indsæt og opdater data i Excel-ark med Python # 23
Inkluderet:
Livstidsadgang
27 videolektioner
7 timers undervisning
Stil spørgsmål
Kursusbevis

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.

Spørgsmål og kommentarer

Kun medlemmer med adgang til dette kursus kan stille spørgsmål og kommentere. Bliv medlem her!

  • Tobias D. siger:

    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>

    1. Tobias D. siger:

      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 ;)

      1. Tobias D. siger:

        Opdatering, dagen derpå kan jeg ikke få det til at virke, jeg så dit svar længere nede, men det virkede heller ikke

        1. Simon R. siger:

          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

  • stig a. siger:

    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

    1. Simon R. siger:

      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

      1. stig a. siger:

        Hej Simon.

        Adressen er pastbin.com/jGW8qyDA

        VH.

        Stig

        1. Simon R. siger:

          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

    2. Simon R. siger:

      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 :)

  • Jessie W. siger:

    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

    1. Simon R. siger:

      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 :)