Daten in neue xlsx in bestimmte Zelle schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Krystek
User
Beiträge: 23
Registriert: Mittwoch 10. November 2021, 10:12

Hallo liebes Python-Forum,

ich bin ein absoluter Python-Neuling, der allerdings vorher mit MATLAB gearbeitet hat. Aktuell fällt es mir schwer meine "MATLAB-Brille" abzusetzen.

Ich habe nach bestem Wissen und Gewissen das Forum nach einem ähnlichen Problem durchsucht. Ich habe leider nichts gefunden, das mir helfen konnte. Es könnte natürlich auch sein, dass ich die Parallele nicht erkannt habe.

Nun zu meinem Vorhaben und Problem.

Ich habe folgende Excel-Tabelle: Bild

In Spalte P wird der Datentyp beschrieben. Ich möchte nun ein Skript erstellen, dass die Zeilen aus der Tabelle rauskopiert, die in Spalte "P" den Datentyp "boolean" enthalten. Diese sollen dann in eine neue Tabelle geschrieben werden.
Das klappt bisher ganz gut. Mein Problem ist, dass ich die Daten in einen bestimmten Bereich schreiben möchte, was leider nicht funktioniert. Die Daten werden jedes mal in ab Zelle "A1" eingefügt.

Code: Alles auswählen

from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font

wb_testspec = load_workbook('C:/....')
ws_testspec = wb_testspec.active

wb_new = Workbook()
ws_new = wb_new.active
ws_new.title = "Test"

ws_new_2 = wb_new.create_sheet("boolean")
for row in ws_testspec.iter_rows():
    if row[15].value == "boolean":   # filter on first column with value 16

        ws_new_2.append((cell.value for cell in row))

wb_new.save('C:/...')
Dieser Code macht das was ich möchte nur soll noch zusätzlich die Tabelle nicht in "A1" sondern bspw. in "C3" beginnen.

Im Netz habe ich einige Beispiele gefunden, wo man bestimmte Zellen ansteuern kann. Allerdings wurden in jedem Beispiel nur Strings in die Zellen geladen. Und ich habe leider nicht verstanden wie ich z.B. folgendes Beispiel so umwandle, dass es meinen Erwartungen entspricht. In dem Beispiel wird 'hello' in "A7", 'world' in "B7", 'this' in "A8", 'is' in "B8", 'another' in "C8"' und 'line' in "D8" geschrieben. Das bedeutet, dass der Code es schafft die Wörter gezielt in bestimmte Zellen zu schreiben. Und das selbe möchte ich nun für meine Tabelle haben. Es muss ja nicht unbedingt dieses Beispiel sein. Vielleicht habt ihr ja einen Lösungsvorschlag für meinen ersten Code.

Code: Alles auswählen

def Output(message):
    wb_testspec = load_workbook('C:/..../leer.xlsx')
    ws_testspec = wb_testspec.active
    ws_testspec.title = 'Quotation'
    Row_size = len(message)

    for row, row_entries in enumerate(message, start=7):
        for column, value in enumerate(row_entries, start=1):
            ws_testspec.cell(column=column, row=row, value=value)

    wb_testspec.save('Quotation.xlsx')

Output([['hello', 'world'], ['this', 'is', 'another', 'line']])
Ich wäre sehr froh und sehr dankbar, wenn ihr mir helfen könntet. Sollte ich mich nicht verständlich genug ausgedrückt haben, bitte ich um Verzeihung und um die Chance dies dann zu verbessern.

VG
Krystek
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Krystek: Ich finde die namen `wb_*` und `ws_*` ziemlich unübersichtlich. Namen sollten keine kryptischen Abkürzungen enthalten und schon gar nicht welche die sich *so* ähnlich sind. Und wenn man es ausschreibt, klingt es nach Meister Yoda. Die Worte müssten anders herum.

Ich verstehe jetzt nicht so ganz das Problem bei der Übertragung der Lösung. Man muss halt die Zellenwerte einzeln eintragen und dafür passende Zeilen- und Spaltenindizes erstellen.

Code: Alles auswählen

#!/usr/bin/env python3
from openpyxl import Workbook, load_workbook
from openpyxl.utils import column_index_from_string, coordinate_to_tuple


def main():
    testspec_sheet = load_workbook("C:/....").active

    workbook = Workbook()
    workbook.active.title = "Test"

    sheet = workbook.create_sheet("boolean")
    target_row_index, target_column_index = coordinate_to_tuple("C3")
    for row in testspec_sheet.rows:
        if row[column_index_from_string("P")].value == "boolean":
            for column_index, cell in enumerate(row, target_column_index):
                sheet.cell(target_row_index, column_index, cell.value)
            target_row_index += 1

    workbook.save("C:/...")


if __name__ == "__main__":
    main()
Was Namensschreibweisen angeht, zum Beispiel von Funktionen, schau bei Gelegenheit mal in den Style Guide for Python Code.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krystek
User
Beiträge: 23
Registriert: Mittwoch 10. November 2021, 10:12

Moin __blackjack__,

vielen Dank für deine Antwort und deinen Lösungsvorschlag. Und danke für den Tipp mit den Namen. Ich werde versuchen dies zu verinnerlichen :)

Ich weiß nicht, ob ich jetzt noch etwas übersehen habe oder einfach zu doof bin aber beim Verwenden deines Codes ist die neu erstellte Tabelle komplett leer.

Hast du eine Ahnung woran das liegen könnte?

Gruß
Krystek
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Krystek: Das Arbeitsblatt ist aber schon da? Also es gibt ja zwei, "Test" und "boolean".

Hast Du mal ein stragegisches `print()` eingebaut um zu sehen ob der Text "boolean" gefunden wird? Mein Code sucht ja in einer anderen Spalte als Deiner. Ich habe mich mit Spalte "P" an Deinem Bildschirmfoto orientiert. Dein Code suchte in Spalte "O".
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krystek
User
Beiträge: 23
Registriert: Mittwoch 10. November 2021, 10:12

Vielen Dank für deine schnelle Rückmeldung, die mich auf den richtigen Weg geführt hat.

Wie du in meiner Tabelle siehst, befinden sich die Infos, nach denen gefiltert werden soll, in Spalte "P". Dein Code sucht auch in Spalte "P". Aber wenn im Code "P" eingegeben wird, wird in Spalte "Q" gesucht.
Daher habe ich mal "O" eingegeben und siehe da...es funktioniert! Du hast mich auf die Idee gebracht, indem du sagtest, dass mein Code in Spalte "O" sucht.

Weißt du woran das liegt?
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das liegt daran das Excel unintuitiverweise (für Programmierer) bei 1 mit dem Zählen anfängt, also Spalte A den Spaltenindex 1 hat und nicht 0. Der Index bei Tupeln, beziehungsweise in Python allgemein, wie die meisten anderen vernünftigen Programmiersprachen, aber bei 0 anfängt zu zählen. Man muss also 1 abziehen:

Code: Alles auswählen

        ...
        if row[column_index_from_string("P") - 1].value == "boolean":
            ...
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krystek
User
Beiträge: 23
Registriert: Mittwoch 10. November 2021, 10:12

alles klar!
Dann noch einmal vielen Dank :)
Antworten