• Über mich
  • Blog
  • Datenschutz
  • Impressum
  • Follow Me On

  • Über mich
  • Blog
  • Datenschutz
  • Impressum

MySQL Daten in Excel

20. Januar 2020

Die letzten beiden Nächte habe ich damit verbracht, meine MySQL Datenbank mit Excel zu verknüpfen und von dort aus dynamische Abfragen zu genieren. Damit Du nicht vor denselben Problemen stehst, möchte ich Dir in diesem Beitrag meine Erfahrungen & Umsetzungen mitteilen.

Vorweg: Eine SQL- Anweisung mit Zellenbezug, direkt in Excel, ist leider nicht möglich. Zu diesem Ergebnis bin ich nach gefühlten 10 Stunden Recherche & Ausprobieren gekommen. Eine alternative Lösung findest Du weiter unten.

Ein Tipp bevor es los geht: Du solltest als erstes sicherstellen, dass deine Datenbank den Zugriff von außen erlaubt, denn meistens lassen diese in der Standardkonfiguration keine externen Anfragen zu.

Meine Ausgangssituation

In einem Excel- Kalkulationstool sollen Sensordaten aus meiner MySQL- Datenbank, welche ich auf einem Raspberry Pi betreibe, in ein Arbeitsblatt eingelesen werden, um damit in einem zweiten Blatt Berechnungen durchzuführen. Aus Performance- Gründen sollen dazu die Daten zeilenweise, also anhand ihres Schlüssels, eingelesen werden. Somit möchte ich das Laden der ganzen Datenbank verhindern und mich nur auf den gewollten Datensatz konzentrieren.

Mein erste Gedanke war in meiner Excel- Arbeitsmappe ein neues Arbeitsblatt anzulegen. In diesem Blatt definiert man dann eine Zelle, in der man die gewünschte Schlüsselnummer für die Abfrage einträgt.
Beim Verbinden mit der Datenbank führt Excel dann eine SQL- Anweisung aus, welche einen Bezug zur Zelle mit der Schlüsselnummer hat.

So einfach wird es nicht

Nachdem ich beim allgemeinen Verbindungsaufbau schon den ersten Dämpfer bekommen habe – keine Verbindung zur Datenbank- folgte der zweite kurz danach.
Nach stundenlanger Suche bin ich zu dem Ergebnis gekommen, dass eine SQL- Anweisung mit Zellenbezug in Excel nicht möglich ist. Lediglich statische Abfragen beim Verbinden können ausgeführt werden.

Beispiel:

SELECT * FROM Tabellenname WHERE id = 1

Damit lädt Excel die Zeile mit der „Schlüsselnummer“ 1 aus der Tabelle „Tabellennamen“ in ein neues Arbeitsblatt.

Nett, aber für mein Vorhaben leider zu umständlich. Ich müsste bei diesem Vorgehen für jede Abfrage in die Verbindungseinstellungen gehen & die gewünschte ID ändern.

Workaround

Spoiler: Nicht direkt wegrennen, auch wenn man keine Ahnung vom Programmieren hat!

Bevor ich mich an die richtige Datenbank gewagt habe, habe ich mit einem kleinen Beispiel angefangen. Dazu habe ich eine SQL- Testtabelle erzeugt, welche Schulfächer, die jeweilige Note & als „Schlüssel“ das Schuljahr beinhaltet.

Excel vorbereiten

In Excel habe ich eine Arbeitsmappe angelegt, welche zwei Arbeitsblätter besitzt – „Datenbank“ & „Berechnung“.

Das Blatt „Berechnung“ enthält, wer hätte es gedacht, die Formel zur Berechnung des Notendurchschnitts. Das Blatt „Datenbank“ soll die ausgelesenen Fächer & Noten aus dem gewünschten Schuljahr beinhalten.

Es ist sinnvoll das Arbeitsblatt „Datenbank“ in einem ähnlichen Schema anzulegen wie die SQL- Tabelle. Somit habe ich in der Spalte A1 „Schuljahr“, in der Spalte B1 das erste Fach, in C1 das zweite Fach… stehen.

Das Blatt „Berechnungen“ hat einen direkten Zellenbezug zum Blatt „Datenbank“, um sich von dort die ausgelesen Noten zu ziehen und dann damit den Notendurchschnitt für das Schuljahr zu berechnen.

Datenbank auslesen

Da ich keine Ahnung von VBA habe, blieb mir nichts anderes übrig als auf eine andere Programmiersprache zu setzten.
Lass dich von dem Wort Programmieren nicht demotivieren, mit Python habe ich auch erst vor ein paar Tagen angefangen. Das schöne ist, Python ist so einfach, dass Du die Schritte mit Sicherheit auch ohne Ahnung vom Programmieren nachvollziehen kannst.

Ich habe den Code Schritt für Schritt mit Kommentaren versehen. Als Editor habe ich Visual Studio Code verwendet, du kannst aber auch jeden anderen benutzen.

Neben Python 3.8.1 auf Windows, natürlich auch für OSX vorhanden, habe ich noch folgende Module über die Eingabeaufforderung/ Terminal installiert:

py -m pip install msql-connector
py -m pip install openpyxl

Der msql-connector erlaubt Python die Verbindung und Verwaltung zur Datenbank. Openpyxl gibt uns die Möglichkeit im Code mit Excel- Arbeitsmappen zu arbeiten.

Was macht der Code

Zunächst öffnet sich eine Eingabemaske, in der man den „Schlüssel“, in unserem Fall das gewollte Schuljahr eingibt.

Anschließend führt der Code die Datenbankabfrage aus:

SELECT * FROM noten WHERE schuljahr = id

In der abgebildeten Abfrage steht „id“ als Platzhalter und ist im Code mit der eingelesenen Variablen aus der Eingabemaske verknüpft.
Im Anschluss öffnet sich die generierte Excel- Arbeitsmappe mit den Datensätzen aus der Datenbank.

Das ganze sieht dann für den Nutzer so aus:

Python und Excel, so geht es:

Die Profis unter euch verzeihen mir bitte den Aufbau und Verzicht auf saubere Funktionen. Für mich zählte zum Ereigniszeitpunkt ausschließlich die Lauffähigkeit.
Ein Update mit einem sauberen Code folgt – bestimmt.

import mysql
import mysql.connector
import os
from time import sleep
import openpyxl

con = mysql.connector.connect(
    host = "raspberrypi", #Serveradresse
    user = "testbenutzer", #DB Benutzername
    passwd = "raspberry", #Passwort der DB
    db = "testdatenbank" #Datenbankname
)

#Eingabe der Schlüsselnummer
id = input("Welches Schuljahr soll geladen werden? ") 

cursor = con.cursor()

#SQL- Anweisung
cursor.execute("SELECT * FROM noten WHERE schuljahr =" + str(id)) 

result = cursor.fetchall()
cursor.close()

#Dateiname der ExcelMappe -> muss im Verzeichnis des Codes liegen
file = 'Notendurchschnitt.xlsx' 

 #Öffnet Mappe in Variable wb => workbook
wb = openpyxl.load_workbook(filename=file)

#Benutze Arbeitsblatt ws => Worksheet
ws = wb.get_sheet_by_name('Datenbank') 

for data in result:
    schuljahr = data[0]
    ws['A2'] = data[0]
    ws['B2'] = data[1]
    ws['C2'] = data[2]
    ws['D2'] = data[3]
    ws['E2'] = data[4]

#Kopie der Mappe mit Namen der ID speichern
wb.save("Durchschnitt_Fuer_Schuljahr_" + str(schuljahr) + ".xlsx")

#Aus Sicherheit 3 Sekunden warten => Speichervorgang
sleep(3)

#Arbeitsmappe mit Excel öffnen
os.system('start excel.exe Durchschnitt_Fuer_Schuljahr_' + str(schuljahr) + '.xlsx')

input("Mit Eingabetaste beenden")

Ich hoffe Dir hat der Eintrag ein wenig geholfen & Du kannst jetzt dynamische Inhalte in Excel verarbeiten. Solltest Du eine andere Lösung gefunden haben, teile sie mir gerne mit.

DatenbankExcelMYSQLPythonSQLTutorial
Share

Blog  / Elektronik

chrkro

You might also like

Python: Word- Dokumente auf Inhalte prüfen
23. April 2020
Raspberry Pi als MYSQL Datenbank Server
16. Januar 2020
  • Follow Me On

  • Schlagwörter

    3d 3d druck app Datenbank docx Excel festplatte filebrowser filesharing ipad ipad pro key MariaDB MariaDB Zugriff Microsoft Microsoft Word MYSQL nfc Office PI printing pro Python Raspberry RaspberryPi schlüssel Sensor speicherplatz voll SQL stick Tutorial usb usb c usbstick Verbindung MariaDB wifi wifi key wlan schlüssel Word Wörter zählen


Christian Kronen | webseite@chrkro.de

Wenn Sie diese Webseite weiter nutzen, gehen ich von einem akzeptieren der Datenschutzbestimmung aus.Akzeptieren Ablehnen Mehr
Datenschutz & Cookies