Python: Openpyxl geeft foutief tabblad terug

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • D3F
  • Registratie: Mei 2016
  • Laatst online: 22-07 23:49
Mijn vraag
Momenteel ben ik bezig met het maken van een script om Excel-bestanden uit te lezen.
Enige vereiste zijn openpyxl, de module die ik gebruik om Excel-bestanden uit te lezen.

Voorbeeld:
  • Excel-bestand: Book
  • Aantal tabbladen: 4
  • Invoer gebruiker bij input excelFile: Book
  • Invoer gebruiker bij input excelSheetName: Sheet2
Output: "4"

Afbeeldingslocatie: https://tweakers.net/i/ur-jPnMTKQ1e_00m-Gdx0J_VHR0=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/d8k4DtJhneh3T9rQZ3eTIwAL.png?f=user_large

De gebruiker wordt gevraagd om een excel-bestand en sheet door te geven, waarbij na elke invoer een check wordt gedaan of deze bestaat.

Ik loop er tegen aan dat Openpyxl niet goed het tabblad selecteert. Hij verifieert weliswaar of het bestand bestaat, maar lijkt vervolgens een willekeurig tabblad te selecteren.

Onderstaand de code. De rest van mijn script heb ik eruit gesloopt zodat alleen de basis blijft staan, waar eveneens de fout in voorkomt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from openpyxl import *          # Voor het openen van Excel-bestanden
import sys

excelFile = input("Excel-file (without .xlsx): ")
try:
    if excelFile == "":
        print("\nNo workbook specified!")
        sys.exit()
    else:
        excelWorkbook = load_workbook(excelFile + ".xlsx")          
        print("\nWorkbook found!")
except:
    print("\nInvalid filename. Please check if the file is present in the folder of where this script is running from.")
    sys.exit()

try:
    if excelFile == "":         
        print("")
    if excelFile != "":         
        excelSheetName = input("\nSheetname: ")
        print(excelSheetName)                                # Test printje om te kijken of ik niet gek ben :)
        if excelSheetName in excelWorkbook:
            excelSheet = excelWorkbook.active                           
            print(excelSheet)
            print("\nWorkbook loaded succesfully!")
        else:
            sys.exit()
except:
    print("\nSheet " + excelSheetName + " not present in file " + excelFile)
    sys.exit()


Relevante software en hardware die ik gebruik
Python 3.8.2
Openpyxl

Wat ik al gevonden of geprobeerd heb
Heb ongeveer 1.000 regels code doorlopen voordat ik erachter kwam dat het fout ging bij bovenstaande invulmoment. Toen dit los getrokken uit de code en het blijkt in dit kleine stukje code fout te gaan.

Enige wat ik nog niet geprobeerd heb is om het script op een andere machine te testen maar heb wel meerdere Excel-bestanden geprobeerd.

Alvast bedankt voor het meedenken!

[ Voor 4% gewijzigd door D3F op 07-08-2020 17:30 ]

Beste antwoord (via D3F op 10-08-2020 11:22)


  • stefaan1o
  • Registratie: April 2020
  • Laatst online: 21:45
code:
1
excelSheet = excelWorkbook.get_sheet_by_name(excelSheetName)

Alle reacties


Acties:
  • +1 Henk 'm!

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
code:
1
excelSheet = excelWorkbook.active
Doet dit wat je bedoelt ? Het lijkt me dat je ongeacht je input, hiermee je Sheet op de active worksheet van het bestand zet. Moet dat niet andersom ?

(verder geen ervaring met openpyxl dus zomaar een gok)

Edit: En je doet ook verder niets met excelSheet Name. Moet je niet excelSheet = excelSheetName doen ?

[ Voor 16% gewijzigd door u_nix_we_all op 07-08-2020 17:41 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Acties:
  • +1 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Python:
22
23
24
        if excelSheetName in excelWorkbook:
            excelSheet = excelWorkbook.active                           
            print(excelSheet)

Tsja, excelWorkbook.active lijkt mij iets anders dan die specifieke gevraagde sheet? Ieder excel-bestand heeft een actieve sheet :p
offtopic:
2nd

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • stefaan1o
  • Registratie: April 2020
  • Laatst online: 21:45
code:
1
excelSheet = excelWorkbook.get_sheet_by_name(excelSheetName)

Acties:
  • +2 Henk 'm!

  • D3F
  • Registratie: Mei 2016
  • Laatst online: 22-07 23:49
Bedankt voor de reacties! Jullie antwoorden wezen allemaal in de juiste richting en het eigenlijk is het ook allemaal heel erg logisch.
Tijdens de ontwikkeling had ik wel een excel-sheet met meerdere tabbladen, maar had het actieve tabblad altijd open, waardoor ik in de veronderstelling was dat het altijd goed ging.

Het antwoord van Stefaan1o is de oplossing waarbij het juiste tabblad wordt geopend!

Edit
Tijdens het testen kreeg ik onderstaande melding:
code:
1
test.py:24: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).


Heb de code nu aangepast naar:
code:
1
excelSheet = excelWorkbook[excelSheetName]


En het werkt als een zonnetje :)

[ Voor 28% gewijzigd door D3F op 10-08-2020 11:29 ]