Antworte auf:  Zellen färben in Excel über Python von Bekell
Forum:  Programmieren, moderiert von: matph

[Zur Forum-Gliederung] [Wie man Fragen beantwortet] [Themenstart einblenden]

  Alle registrierten Mitglieder können Mitteilungen schreiben.
Benutzername:
Passwort:
Nachricht-Icon:                   
                  
              
Nachricht:


 
 


Input assistance tools (JavaScript): [Link extern intern] [MathML?] [$$?]
[fed-area] [LaTeX-inline] [LaTeX-display] [Tikz] [hide-area][show-area] [Source code [num.]][?]
 Show Preview      Write using fedgeo formula editor or Latex.

Smilies for your message:
😃 😄 😁 🙂 🙃 😉 🤗 🤫 🤔 🙄 😴 🤒 😎 😮 😲 😂
🙁 😖 😒 😐 😡 👌 👍 👎 🤢 🤧 🥵 🥶 😵 🤯 😛 😷
Optionen: Deaktiviere HTML in dieser Nachricht
Deaktiviere MATHML in dieser Nachricht. Wenn Dein Text $-Zeichen enthält, die nicht LaTeX-Formeln begrenzen.
Deaktiviere Smilies in dieser Nachricht
Zeige die Signatur (Kann in 'Mein Profil' editiert werden.)
    [Abbrechen]
 
Beachte bitte die [Forumregeln]


Themenübersicht
Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 415
Wohnort: Deutschland

 Beitrag No.43, eingetragen 2021-06-16 14:23    [Diesen Beitrag zitieren]
Vor ein paar Jahren lautete die einfache Antwort: "Open Office kann kein vba". Eine kurze Recherche ergibt das hier: https://tipsmake.com/openofficeorg-calc-adds-excel-vba-support inwieweit das nutzbar ist, kann ich aber nicht bewerten. vielleicht hilft es dir weiter auf deiner Suche.

dietmar0609
Senior
Dabei seit: 29.06.2007
Mitteilungen: 3092
Wohnort: Oldenburg , Deutschland

 Beitrag No.42, eingetragen 2021-06-16 14:17    [Diesen Beitrag zitieren]
Habe nichts vernünftiges gefunden ...

dietmar0609
Senior
Dabei seit: 29.06.2007
Mitteilungen: 3092
Wohnort: Oldenburg , Deutschland

 Beitrag No.41, eingetragen 2021-06-16 10:25    [Diesen Beitrag zitieren]
hallo Haegar, Vielen Dank. Ich arbeite mit open_office_calc und habe die Entwickler tools noch nicht gefunden. Mache mich jetzt an die Suche. Gruß Dietmar

haegar90
Aktiv
Dabei seit: 18.03.2019
Mitteilungen: 704
Wohnort: Gog

 Beitrag No.40, eingetragen 2021-06-15 17:18    [Diesen Beitrag zitieren]
Hallo Dietmar, in #38 ist der Reiter "Entwicklertools" zu sehen. Da auf Visual Basic gehen. Falls Reiter "Entwicklertools" nicht sichtbar, kannst Du den in den Einstellungen aktivieren. https://matheplanet.com/matheplanet/nuke/html/uploads/b/51352_makro_insert.png In deiner Arbeitsmappe dann einfach ein neues Modul erstellen und den Quellcode da hinein kopieren.

dietmar0609
Senior
Dabei seit: 29.06.2007
Mitteilungen: 3092
Wohnort: Oldenburg , Deutschland

 Beitrag No.39, eingetragen 2021-06-15 15:47    [Diesen Beitrag zitieren]
Hallo Haegar, Vielen Dank, habe den Code verstanden. Wie binde ich ihn jetzt in mein Excel Sheet ein? Das konnte ich alles früher mal habe es aber in der Zwischenzeit vergessen. Gruß Dietmar

haegar90
Aktiv
Dabei seit: 18.03.2019
Mitteilungen: 704
Wohnort: Gog

 Beitrag No.38, eingetragen 2021-06-14 15:56    [Diesen Beitrag zitieren]
\sourceon Basic Sub Schleife() Dim i, j, cnt As Long For i = 1 To 10 For j = 1 To 15 nbr = i * j + i Cells(i, j).Value = nbr If Cells(i, j).Value Mod 3 = 0 Then Cells(i, j).Interior.Color = vbRed If Cells(i, j).Value Mod 4 = 0 Then Cells(i, j).Interior.Color = vbBlue If Cells(i, j).Value Mod 5 = 0 Then Cells(i, j).Interior.Color = vbGreen If Cells(i, j).Value Mod 7 = 0 Then Cells(i, j).Interior.Color = vbYellow Next Next cnt = 0 For i = 1 To 15 If Cells(1, i).Interior.Color = vbYellow Then cnt = cnt + Cells(1, i).Value Next Cells(12, 1).Value = cnt End Sub \sourceoff https://matheplanet.com/matheplanet/nuke/html/uploads/b/51352_FarbigeZellenExcel.png Hallo, habe mich jetzt auch länger nicht mehr mit VisualBasic befasst. Prinzipiell funktioniert es aber so mit dem Excel vba. Ist nur als Vorschlag gedacht. Könnte auch eine Sub machen mit Übergabe, Suchbereich und Farbe. Vermutlich gibt es aber die Funktion bereits. Weiß aber nicht ob auch in Excel vba verfügbar, da der Umfang von vba im Vergleich zu VisualBasic eher erbärmlich ist. Alles was im Quellcode vor "cnt=0" steht füllt nur die Zellen, der Rest ist die Suche nach der Farbe.

DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2964
 Beitrag No.37, eingetragen 2021-06-14 14:49    [Diesen Beitrag zitieren]
Hier in openpyxl könnte man bspw. über den Bereich iterieren und die fill-Attribute der Zellen abfragen. Das sollte in VB grundsätzlich auch funktionieren. Du musst dazu natürlich wissen, wie genau das Stilobjekt aussieht und wie dessen Farbattribute heißen.

dietmar0609
Senior
Dabei seit: 29.06.2007
Mitteilungen: 3092
Wohnort: Oldenburg , Deutschland

 Beitrag No.36, eingetragen 2021-06-14 14:02    [Diesen Beitrag zitieren]
Vielleich passt folgendes Problem hier rein: Ich möchte in einer Zeile oder Spalte selektiv nur die Felder einer bestimmten Hintergrundfarbe addieren. Habe es mit VB vergeblich versucht. Gibt es da Ansätze oder Lösungen ? LG Dietmar

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.35, eingetragen 2021-06-13 22:22    [Diesen Beitrag zitieren]
https://matheplanet.com/matheplanet/nuke/html/uploads/b/23651_Fa_rbeu_bungfertig.png Danke Zippy, hat geklappt: \sourceon Python \numberson from openpyxl.utils import get_column_letter ... ws.column_dimensions[get_column_letter(y)].width = 5 # nich so einfach \sourceoff Die beiden Sachen hab ich implementiert.... vielen Dank nochmals, auch an den Einfältigen, für die zielführende Begleitung jetzt muss ich in's Bett....

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.34, eingetragen 2021-06-13 21:54    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 21:21 - Bekell in Beitrag No. 33) ich weiss nicht, was ich da zuvor implementieren muss, etc. \quoteoff Du schreibst beispielsweise (wenn ws dein Worksheet ist): \sourceon python ws.column_dimensions['G'].width = 20 \sourceoff An den Spaltenbuchstaben (hier 'G') kommst du entweder, indem du das column_letter-Attribut einer Zelle in dieser Spalte ausliest, oder, indem du die get_column_letter-Methode aus openpyxl.utils für die Übersetzung Index $\to$ Buchstabe benutzt.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.33, eingetragen 2021-06-13 21:21    [Diesen Beitrag zitieren]
Danke, Zippy, aber die Dokumentation ist sehr irritierend (nicht idiotensicher) ich weiss nicht, was ich da zuvor implementieren muss, etc. bei w3scools versteh ich alles, hier nur sehr bedingt.... Es sind keine Beispiele....

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.32, eingetragen 2021-06-13 21:12    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 21:04 - Bekell in Beitrag No. 31) Weisst Du das nooch mit der Cellebreite.. Vllt. gibt es so einen Befehl cell.widt() \quoteoff Die Breite ist keine Eigenschaft der einzelnen Zelle, sondern der gesamten Spalte. Wenn du in das Suchfeld der OpenPyXl-Doku "width" eingibst, findest du die zuständige Klasse openpyxl.worksheet.dimensions.ColumnDimension.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.31, eingetragen 2021-06-13 21:04    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:52 - zippy in Beitrag No. 30) \quoteon(2021-06-13 20:49 - Bekell in Beitrag No. 29) Bei mir stehen keine Zahlen in drei Feldern, kannst Du mal einen Screenshot posten? \quoteoff Habe ich oben ergänzt. \quoteoff Danke, hab's gefunden, es sieht bei mir etwas anders aus. Da sind dann auch die Hex-Werte. Weisst Du das nooch mit der Cellebreite.. Vllt. gibt es so einen Befehl cell.widt() morgen nachmittag poste ich das Ergebnis.

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.30, eingetragen 2021-06-13 20:52    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:49 - Bekell in Beitrag No. 29) Bei mir stehen keine Zahlen in drei Feldern, kannst Du mal einen Screenshot posten? \quoteoff Habe ich oben ergänzt.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.29, eingetragen 2021-06-13 20:49    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:46 - zippy in Beitrag No. 28) \quoteon(2021-06-13 20:39 - Bekell in Beitrag No. 27) da werden aber nicht die Codes angezeigt.... die brauch ich doch, um das gewünschte zu erhalten.... \quoteoff Wenn ich eine Zelle gelb färbe, steht in diesem Feld "#FFFF00". Falls du irgendein antiquiertes Excel ohne das "Hex"-Feld benutzt, must du die drei Zahlen in den Felder "Rot", "Grün" und "Blau" nach Hex umrechnen und die entstehenden 2-stelligen Hex-Zahlen hintereinanderhängen. \quoteoff Mein Excel: 16,49 for Mac von 2019 Bei mir stehen keine Zahlen in drei Feldern, kannst Du mal einen Screenshot posten?

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.28, eingetragen 2021-06-13 20:46    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:39 - Bekell in Beitrag No. 27) da werden aber nicht die Codes angezeigt.... die brauch ich doch, um das gewünschte zu erhalten.... \quoteoff Wenn ich eine Zelle gelb färbe, steht in diesem Feld "#FFFF00": Falls du irgendein antiquiertes Excel ohne das "Hex"-Feld benutzt, must du die drei Zahlen in den Felder "Rot", "Grün" und "Blau" nach Hex umrechnen und die entstehenden 2-stelligen Hex-Zahlen hintereinanderhängen.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.27, eingetragen 2021-06-13 20:39    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:36 - zippy in Beitrag No. 26) \quoteon(2021-06-13 20:31 - Bekell in Beitrag No. 25) Und wo sind die in excel zu finden, die Codes? \quoteoff Kontextmenü der Zelle > Zellen formatieren > Ausfüllen > Weitere Farben > Benutzerdefiniert > Feld "Hex" ohne das führende "#". \quoteoff da werden aber nicht die Codes angezeigt.... die brauch ich doch, um das gewünschte zu erhalten.... Theoretisch müsste man doch auch die Spaltenbreite als Cell.attribut anbringen können automatisch?

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.26, eingetragen 2021-06-13 20:36    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:31 - Bekell in Beitrag No. 25) Und wo sind die in excel zu finden, die Codes? \quoteoff Kontextmenü der Zelle > Zellen formatieren > Ausfüllen > Weitere Farben > Benutzerdefiniert > Feld "Hex" ohne das führende "#".

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.25, eingetragen 2021-06-13 20:31    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:30 - zippy in Beitrag No. 24) \quoteon(2021-06-13 20:16 - Bekell in Beitrag No. 23) Kennst Du eine Farbtabelle, wo diese Codes "FFFF0000"mit den dazugehörigen Farben unterlegt sind, damit man nicht ewig probieren muss, um seine Farben zu finden? \quoteoff Wenn du nicht mit indizierten Farben (8-stellig) sondern mit RGB-Farben (6-stellig) arbeitest, kannst du die entweder in jeder Tabelle für Webdesign nachschlagen oder einfach aus Excel abschreiben. \quoteoff wie würde in dem Fall diese XClasse aussehen: yellowFill = PatternFill(start_color="00FFFF00", end_color="00FFFF00", fill_type="solid") Und wo sind die in excel zu finden, die Codes? und warum sind die anderswo nur sechsstellig: FF00FF für magenta

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.24, eingetragen 2021-06-13 20:30    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:16 - Bekell in Beitrag No. 23) Kennst Du eine Farbtabelle, wo diese Codes "FFFF0000"mit den dazugehörigen Farben unterlegt sind, damit man nicht ewig probieren muss, um seine Farben zu finden? \quoteoff Der Farbcode (8-stellig) besteht aus einem 2-stelligen Wert für Transparenz, den du einfach auf 0 setzen kannst, und einem 6-stelligen Wert für die RGB-Farbe. Letzteren kannst du die entweder in jeder Tabelle für Webdesign nachschlagen oder einfach aus Excel abschreiben.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.23, eingetragen 2021-06-13 20:16    [Diesen Beitrag zitieren]
Kennst Du eine Farbtabelle, wo diese Codes "FFFF0000"mit den dazugehörigen Farben unterlegt sind, damit man nicht ewig probieren muss, um seine Farben zu finden? Die dort hinterlegte ist etwas steinzeitrig... was sind denn das für Codes? https://encycolorpedia.de/88ff00

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.22, eingetragen 2021-06-13 20:08    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 20:00 - Bekell in Beitrag No. 21) wo kuckst Du das nach, Zippy, welche Methoden das da gibt? \quoteoff Genau da, wohin Scynja schon vor 18 Beiträgen einen Link gepostet hat.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.21, eingetragen 2021-06-13 20:00    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 19:54 - zippy in Beitrag No. 20) ws.cell(1,x).value = 1 \quoteoff Danke, wo kuckst Du das nach, Zippy, welche Methoden das da gibt? Wenn ich fertig bin, poste ich das Ergebnis, weil: Vllt brauchts ja noch ein anderer

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.20, eingetragen 2021-06-13 19:54    [Diesen Beitrag zitieren]
ws.cell(1,x).value = 1

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.19, eingetragen 2021-06-13 19:49    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 19:48 - zippy in Beitrag No. 18) \quoteon(2021-06-13 19:43 - Bekell in Beitrag No. 16) sowas: ws.cell(1,x) = [1] funktioniert nicht... \quoteoff Eine Zelle enthält nur einen Wert, also: ws.cell(1,x) = 1. [Die Antwort wurde nach Beitrag No.16 begonnen.] \quoteoff dann kommt sowas: ws.cell(1,x) = 1 ^ SyntaxError: can't assign to function call

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.18, eingetragen 2021-06-13 19:48    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 19:43 - Bekell in Beitrag No. 16) sowas: ws.cell(1,x) = [1] funktioniert nicht... \quoteoff Eine Zelle enthält nur einen Wert, also: ws.cell(1,x) = 1. [Die Antwort wurde nach Beitrag No.16 begonnen.]

DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2964
 Beitrag No.17, eingetragen 2021-06-13 19:48    [Diesen Beitrag zitieren]
Vermutlich weil Excelzellen in ihrem value-Attribut keine Pythonlisten speichern können, sondern nur (string, float, int or datetime.datetime).

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.16, eingetragen 2021-06-13 19:43    [Diesen Beitrag zitieren]
Hab jetzt die Schwierigkeit, die Zahlen in die roten Felder zu kriegen.... \sourceon Python \numberson or x in range(1,210,2): y1.append(x) if x%5==0: y2.append(1) ws.cell(1,x).fill = redFill else: y2.append("") #ws.cell(2,x).fill = redFill def def_zellennamen(h): # Hier wird der Spaltenbuchstabe mit der zeilennummer zu einer Zellen-Adresse verschmolzen. strx="B"+str(h) return strx #def_spaltennummer(h): #ws.cell(5,5).fill = taublauFill #ws[def_zellennamen(1)].fill = redFill #ws.append([def_zellennamen(1),2,3]) ws.append(["Nr"]+y1) ws.append(["Pz5"]+y2) \sourceoff sowas: ws.cell(1,x) = [1] funktioniert nicht...

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.15, eingetragen 2021-06-13 19:07    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 19:04 - Bekell in Beitrag No. 14) jetzt muß ich nur das alphanumerische Zählen von Excel noch irgendwie imitieren \quoteoff Nein, das musst du nicht: \quoteon(2021-06-13 18:48 - zippy in Beitrag No. 12) Du hättest auch statt der Excelbezeichnung deren Koordinaten angeben und ws.cell(column=2, row=1) schreiben können. \quoteoff

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.14, eingetragen 2021-06-13 19:04    [Diesen Beitrag zitieren]
https://matheplanet.com/matheplanet/nuke/html/uploads/b/23651_Fa_rbeu_bung.png Eine Hürde hab ich schon, jetzt muß ich nur das alphanumerische Zählen von Excel noch irgendwie imitieren, und dann die Zahl in das gefärbte Feld reinbringen..... habt Ihr da eine Idee mit dem alphanumerischen Zählen? [Die Antwort wurde nach Beitrag No.12 begonnen.]

DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2964
 Beitrag No.13, eingetragen 2021-06-13 18:51    [Diesen Beitrag zitieren]
ws["A1"] ist die Zelle mit dem Namen/den Koordinaten "A1" im Worksheet ws. Zellen haben (vermutlich dutzende) Attribute. Eines davon ist fill, in dem offenbar Informationen über die Darstellung des Zellenhintergrundes, also die "Füllung" gespeichert werden. Dem kann man dann irgendein Füllmusterstilobjekt (PatternFill-Objekt) zuweisen, in dem steht, welche Hintergrundfarbe, Schraffierung, Schattierung etc. angezeigt werden soll. taublauFill ist so ein Füllmusterstilobjekt, dem du vermutlich einen blauen Farbton und was-auch-immer zugewiesen hast. Details siehe oben, von scynja dir die Dokumentation herausgesucht und verlinkt hat. ws.append(iterable) erzeugt am unteren Ende des Worksheets eine neue Zeile und fügt dort die Werte aus dem iterable ein. In deinem Fall verknüpfst du die zwei Listen ["3"] und y1 und hängst das Ergebnis dann unten an. PS.: Statt in irgendein Pythonbuch würde ich ja eher in die Dokumentation von openpyxl schauen, wenn ich damit Probleme hätte. [Die Antwort wurde nach Beitrag No.11 begonnen.]

zippy
Senior
Dabei seit: 24.10.2018
Mitteilungen: 2567
 Beitrag No.12, eingetragen 2021-06-13 18:48    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 18:00 - Bekell in Beitrag No. 11) \sourceon Python ws["B1"].fill = taublauFill \sourceoff \quoteoff ws ist ein Worksheet. Ein Worksheet kennt eine Methode __getitem__, die unter anderem zu der Excelbezeichnung einer einzelnen Zelle eben diese Zelle liefert. Und diese Methode wird implizit aufgerufen, wenn man einen Wert in einem Paar eckiger Klammern hinter ein Worksheet-Objekt schreibt. Also ist ws["B1"] eine Zelle. Du hättest auch statt der Excelbezeichnung deren Koordinaten angeben und ws.cell(column=2, row=1) schreiben können. Eine Zelle ist ein StyleableObject und hat als solches ein fill-Attribut. Also setzt die Zuweisung dieses Attribut auf den Wert von taublauFill.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.11, eingetragen 2021-06-13 18:00    [Diesen Beitrag zitieren]
Danke, Einfältiger, ich muß dann noch mal zum Unterscheid dieser beiden Zeilen was fragen: \sourceon Python \numberson ws["B1"].fill = taublauFill ws.append(["3"]+y1) \sourceoff ws meint ja immer Worksheet, also Arbeitsblatt. Das 2. ws mit dem append ist ein Container, das sehe ich, bei dem bei jedem Schleifendurchgang was reingeschrieben wird. Aber was ist das erste ws? Was bedeutet der Punkt und das fill? Das "B1" ist die Zellenbezeichnung, die übergeben wird. Warum steht da nicht ws.fill("B1")? Es ist die Anweisung, für eine bestimmte Zelle, die Methode Taublau aufzurufen. Ich hab dummerweise mein Python-Buch zuhause (ca. 1000 km) hab dies jetzt gebastelt zum Zellennamenaufrufen: \sourceon Python def def_zellennamen(h): strx="B"+str(h) return strx \numberson \sourceoff es funzt auch!

DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2964
 Beitrag No.10, eingetragen 2021-06-13 16:43    [Diesen Beitrag zitieren]
Zellennamen in Excel sind nunmal Strings bestehend aus Spaltenname und Zeilennummer. Das weiß sogar ich als Excelnicht(s)nutzer. Von daher verstehe ich die Frage nicht. Ein Worksheet ist ein Container, dessen Indizes/Schlüssel eben Excelzellennamen sind. Also schreibt man (wie sonst auch immer und überall) Container[Schlüssel], um auf den mit Schlüssel gespeicherten Inhalt des Containers zuzugreifen. Ist dieser Inhalt eine Excelzelle mit einem Attribut namens fill, dem man ein Patternfill-Objekt names taublauFill als Ergebnis der Methode PatternFill (offenbar ein Konstruktor oder eine Factory) zuweisen will, so schreibt man eben Container[Schlüssel].fill = taublauFill Heißt der Container nun ws und der Schlüssel "A1", so schreibt man eben \sourceon Python ws["A1"].fill = taublauFill \sourceoff Und nein, du berechnest nirgendwo Zellennamen. Du hängst Einträge ans Ende von Zeilen oder Spalten (was auch immer y1,y2 sind) an.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.9, eingetragen 2021-06-13 15:53    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 15:51 - Bekell in Beitrag No. 8) \quoteon(2021-06-13 15:47 - DerEinfaeltige in Beitrag No. 7) PS.: redFill ist keine Methode. \quoteoff \quoteoff Es ist ein Variable, wo das Ergebnis der Methode "PatternFill" gespeichert wird? \quoteon Berechne doch einfach, welche Zelle was enthalten und wie formattiert werden soll und dann weise zu. \quoteoff hab ich doch hier gemacht: \sourceon Python for x in range(1,210,2): y1.append(x) if x%5==0: y2.append(1) else: y2.append("") \numberson \sourceoff Es funktioniert auch! hiervon: \sourceon Python ws["B1"].fill = taublauFill \sourceoff versteh ich ausser dem ws gar nichts. Ich versteh nicht, warum die Excell-Zell Bezeichnung als String gesetzt wird?

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.8, eingetragen 2021-06-13 15:51    [Diesen Beitrag zitieren]
\quoteon(2021-06-13 15:47 - DerEinfaeltige in Beitrag No. 7) PS.: redFill ist keine Methode. \quoteoff Es ist ein Variable, wo das Ergebnis der Methode "PatternFill" gespeichert wird?

DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2964
 Beitrag No.7, eingetragen 2021-06-13 15:47    [Diesen Beitrag zitieren]
Listen besitzen kein Attribut namens fill. Dein Code ergibt keinen Sinn. Berechne doch einfach, welche Zelle was enthalten und wie formattiert werden soll und dann weise zu. PS.: redFill ist keine Methode.

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.6, eingetragen 2021-06-13 15:00    [Diesen Beitrag zitieren]
Es ist ja schon ma ein Vorteil, Einfältiger, dass Du nicht diese Farb-Codes 0000FFFF nutzt, sondern Farb-Namen, wie z.B. tomato hast. \sourceon Python \numberson def def_fill(x): ["C1"].fill = redFill return ws["B2"].fill = taublauFill for x in range(1,210,2): y1.append(x) if x%5==0: y2.append(1) else: y2.append("") ws.append([def_fill(1),2,3]) ws.append(["3"]+y1) ws.append(["5"]+y2) wb.save("/Users/ottoreincke/Desktop/ProjLeg/Exceldat/Färbeübung(210).xlsx") print(y1) print(y2) \sourceoff da sagt er zu: 'list' object has no attribute 'fill' Das "redFill" ist offensichtlich eine Methode. Warum man die nicht auf eine Liste anwenden kann, weiss ich nicht. Ich habe sie in eine Funktion gepackt und versucht aufzurufen.... Die Zellen, die gefärbt werden sollen, werden in die Liste y2 gepackt. Da müssten ja auch die Färbe-Infos hin, denn es sind ja wohl escape-Sequenzen. Auch das geht nicht: \sourceon Python \numberson def def_fill(x): Inhalt=[] Inhalt=["C","x"] ["Inhalt"].fill = redFill return \sourceoff

DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2964
 Beitrag No.5, eingetragen 2021-06-13 12:20    [Diesen Beitrag zitieren]
Eine allgemeine Lösung für so ein Problem: 1. Man schreibe eine Funktion/Methode, die ein Kästchen so modifiziert, wie man es will. 2. Man schreibe eine Funktion, die diejenige Kästchenteilmenge berechnet, die man modifizieren will. 3. Man wendet die Funktion aus 1. auf die Elemente der Menge aus 2. an. Ansonsten ist Excel eine recht merkwürdige Wahl für so ein Problem. Gefärbte Tabellen mit html ohne irgendwelche obskuren Module zu importieren könnte man bspw. wie folgt erzeugen: \sourceon Python \numberson # FizzBuzz def baueFizzBuzzMatrix(N,Spalten,fizz=5,buzz=7): Matrix = {} if N % Spalten == 0: Zeilen = N // Spalten else: Zeilen = N // Spalten + 1 zei = 1 spa = 1 for n in range(1,N+1): Matrix[zei,spa] = {"value": ""} if (n % fizz == 0 or str(fizz) in str(n)) and (n % buzz == 0 or str(buzz) in str(n)): Matrix[zei,spa]["value"] = "fibu" Matrix[zei,spa]["style"] = "background-color:tomato;" elif n % fizz == 0 or str(fizz) in str(n): Matrix[zei,spa]["value"] = "fizz" Matrix[zei,spa]["style"] = "background-color:tomato;" elif n % buzz == 0 or str(buzz) in str(n): Matrix[zei,spa]["value"] = "buzz" Matrix[zei,spa]["style"] = "background-color:tomato;" else: Matrix[zei,spa]["value"] = n Matrix[zei,spa]["style"] = "background-color:powderblue;" spa += 1 if n % Spalten == 0: zei += 1 spa = 1 return Matrix # Baue html-Tabelle auf Basis des Dictionary # Matrix = {(zei,spa): {"value": x, "style": s}} def baueHTMLTable(Matrix): Zeilen = max(zei for (zei,spa) in Matrix) Spalten = max(spa for (zei,spa) in Matrix) table = "\n" for zei in range(1,Zeilen+1): table += "\t\n" for spa in range(1,Spalten+1): if not (zei,spa) in Matrix: table += "\t\t\n" else: table += f"\t\t\n" table += "\t\n" table += "
{Matrix[zei,spa]['value']}
\n" return table # Baue das fertige html-Dokument mit def baueHTMLDokument(Matrix,fileName): html = f"\n\n\n{fileName}\n\n\n" html += baueHTMLTable(Matrix) html += "\n\n" with open(fileName,"w") as f: f.write(html) baueHTMLDokument(baueFizzBuzzMatrix(111,10),"FizzBuzz57.html") baueHTMLDokument(baueFizzBuzzMatrix(100,10,3,5),"FizzBuzz35.html") \sourceoff
1 2 3 4 fizz 6 buzz 8 9 fizz
11 12 13 buzz fizz 16 buzz 18 19 fizz
buzz 22 23 24 fizz 26 buzz buzz 29 fizz
31 32 33 34 fibu 36 buzz 38 39 fizz
41 buzz 43 44 fizz 46 buzz 48 buzz fizz
fizz fizz fizz fizz fizz fibu fibu fizz fizz fizz
61 62 buzz 64 fizz 66 buzz 68 69 fibu
buzz buzz buzz buzz fibu buzz buzz buzz buzz fizz
81 82 83 buzz fizz 86 buzz 88 89 fizz
buzz 92 93 94 fizz 96 buzz buzz 99 fizz
101 102 103 104 fibu 106 buzz 108 109 fizz
111
1 2 fizz 4 buzz fizz 7 8 fizz buzz
11 fizz fizz 14 fibu 16 17 fizz 19 buzz
fizz 22 fizz fizz buzz 26 fizz 28 29 fibu
fizz fizz fizz fizz fibu fizz fizz fizz fizz buzz
41 fizz fizz 44 fibu 46 47 fizz 49 buzz
fibu buzz fibu fibu buzz buzz fibu buzz buzz fibu
61 62 fizz 64 buzz fizz 67 68 fizz buzz
71 fizz fizz 74 fibu 76 77 fizz 79 buzz
fizz 82 fizz fizz buzz 86 fizz 88 89 fibu
91 92 fizz 94 buzz fizz 97 98 fizz buzz
Eine andere Matrix mit markierten Primzahlen und Quadratzahlen ergibt dann bspw.:
1 2 3 4 5 {2: 1, 3: 1} 7 {2: 3} 9 {2: 1, 5: 1}
11 {2: 2, 3: 1} 13 {2: 1, 7: 1} {3: 1, 5: 1} 16 17 {2: 1, 3: 2} 19 {2: 2, 5: 1}
{3: 1, 7: 1} {2: 1, 11: 1} 23 {2: 3, 3: 1} 25 {2: 1, 13: 1} {3: 3} {2: 2, 7: 1} 29 {2: 1, 3: 1, 5: 1}
31 {2: 5} {3: 1, 11: 1} {2: 1, 17: 1} {5: 1, 7: 1} 36 37 {2: 1, 19: 1} {3: 1, 13: 1} {2: 3, 5: 1}
41 {2: 1, 3: 1, 7: 1} 43 {2: 2, 11: 1} {3: 2, 5: 1} {2: 1, 23: 1} 47 {2: 4, 3: 1} 49 {2: 1, 5: 2}
{3: 1, 17: 1} {2: 2, 13: 1} 53 {2: 1, 3: 3} {5: 1, 11: 1} {2: 3, 7: 1} {3: 1, 19: 1} {2: 1, 29: 1} 59 {2: 2, 3: 1, 5: 1}
61 {2: 1, 31: 1} {3: 2, 7: 1} 64 {5: 1, 13: 1} {2: 1, 3: 1, 11: 1} 67 {2: 2, 17: 1} {3: 1, 23: 1} {2: 1, 5: 1, 7: 1}
71 {2: 3, 3: 2} 73 {2: 1, 37: 1} {3: 1, 5: 2} {2: 2, 19: 1} {7: 1, 11: 1} {2: 1, 3: 1, 13: 1} 79 {2: 4, 5: 1}
81 {2: 1, 41: 1} 83 {2: 2, 3: 1, 7: 1} {5: 1, 17: 1} {2: 1, 43: 1} {3: 1, 29: 1} {2: 3, 11: 1} 89 {2: 1, 3: 2, 5: 1}
{7: 1, 13: 1} {2: 2, 23: 1} {3: 1, 31: 1} {2: 1, 47: 1} {5: 1, 19: 1} {2: 5, 3: 1} 97 {2: 1, 7: 2} {3: 2, 11: 1} 100


Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.4, eingetragen 2021-06-13 08:27    [Diesen Beitrag zitieren]
Danke, Scynia, das ist leider ein bischen zu hoch für hoch momentan... Kannst Du Dir vorstellen, wie man das macht, dass er y2, da packt er in jedes 5. Kästchen eine 1, daß diese 1 auch noch mit hintergrundgefärbt wird, meinetwegen Rosa?

Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 415
Wohnort: Deutschland

 Beitrag No.3, eingetragen 2021-06-12 22:28    [Diesen Beitrag zitieren]
redFill ist ein Objekt der Klasse PatternFill. Die Klasse kannst du dir hier durchlesen: https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/styles/fills.html#PatternFill Zeile 14 wird der Konstruktor mit den Parametern start_color="FFFF0000", end_color="FFFF0000" und fill_type="solid" aufgerufen. Für die anderen Parameter werden Default-Werte verwendet. \sourceon Python def __init__(self, patternType=None, fgColor=Color(), bgColor=Color(), fill_type=None, start_color=None, end_color=None): \sourceoff

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Beitrag No.2, eingetragen 2021-06-12 22:02    [Diesen Beitrag zitieren]
\quoteon(2021-06-12 21:34 - Scynja in Beitrag No. 1) ..ist yellowFill definiert? \quoteoff Hallo Scynia, ya, inzwischen ja, aber ich versteh die ganze Grammatik nicht. Ist "redFill" denn eine Funktion? Dann fehlt aber das "def". Warum steht die Zellbezeichnung in Anführungszeichen? Man kann z.B. nicht die Excel-typische Bereichsdefinition eingeben: A1:A7, dann sagt er: \sourceon Python \numberson ws["C2:C4"].fill = redFill AttributeError: 'tuple' object has no attribute 'fill' \sourceoff

Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 415
Wohnort: Deutschland

 Beitrag No.1, eingetragen 2021-06-12 21:34    [Diesen Beitrag zitieren]
Hallo Bekell, ist yellowFill definiert?

Bekell
Aktiv
Dabei seit: 05.09.2008
Mitteilungen: 2491
 Themenstart: 2021-06-12 18:40    [Diesen Beitrag zitieren]
\sourceon Python \numberson import openpyxl from openpyxl import Workbook from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles import colors from openpyxl.cell import Cell y1=[] y2=[] x=0 wb = openpyxl.Workbook() ws = wb.active redFill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid") taublauFill = PatternFill(start_color="0099CCFF", end_color="0099CCFF", fill_type="solid") ws["A1"].fill = redFill for x in range(1,210,2): y1.append(x) if x%5==0: y2.append(1) else: y2.append("") ws.append(["3"]+y1) ws.append((["5"].fill = taublauFill)+y2) wb.save("/Desktop/ProjLeg/Exceldat/Färbeübung(210).xlsx") print(y1) print(y2) \sourceoff Die Zeile 20 funktioniert. In Zeile 29 wollte ich jede 5 zelle färben, es geht aber nicht. in y 2 sind die Daten drinne, in welche Zelle eine 1 kommt, also die ist durch 5 teilbar.... Das stimmt noch nicht, weil in die Anführungszeichen die Zellenadresse muss... Hat jemand einen Vorschlag?

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]