Seite 1 von 1

Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 14:59
von Bykl
Hallo, ich habe das Problem, daß mein Programm keine Liste in eine Excel Zelle schreiben will. Das andre funktioniert.

Was kann ich tun, um das Problem zu umgehen, bzw. zu lösen.

Code: Alles auswählen

from openpyxl import Workbook
from openpyxl import load_workbook
from sympy.ntheory import isprime
from sympy import primepi


wb = Workbook()
zahl=500
laufv=0
i=0

def ermittel_primteiler(x):
    primteiler_liste=[]
    for i in range(3,x//2,2):
        if x%i==0 and isprime(i):
            primteiler_liste.append(i)
    return(primteiler_liste)

ws=wb.active           
for n in range(3,zahl//2,10):
    i = i+1
    pendant=zahl-n-4
    laufv=zahl-pendant-4
    liste_laufv=ermittel_primteiler(laufv)
    liste_pendant=ermittel_primteiler(pendant)
    ws.append([i,pendant," PT",laufv,"PT"])
wb.save("test1excel.xlsx")
Dies muß falsch sein:

Code: Alles auswählen

 ws.append([i,pendant,ermittel_primteiler(pendant),laufv,"PT"])
denn er reagiert: ValueError: Cannot convert [17, 29] to Excel

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 15:42
von __blackjack__
@Bykl: Was würdest Du denn an der Stelle erwarten? Man kann halt nur *einen* Wert in *einer* Zelle unterbringen. Geht doch direkt im Tabellenkalkulationsprogramm auch nicht anders.

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 18:10
von Bykl
Ich habe das Problem inzwischen mit Typumwandlung gelöst:

Code: Alles auswählen

from openpyxl import Workbook
from openpyxl import load_workbook
import matplotlib.pyplot as plt 
import numpy as np
from sympy.ntheory import isprime
from sympy import sieve
from sympy import primepi


wb = Workbook()
zahl=10000
laufv=0
i=0

def ermittel_primteiler(x):
    primteiler_liste=[]
    for i in range(3,x//2,2):
        if x%i==0 and isprime(i):
            primteiler_liste.append(i)
    return(primteiler_liste)

ws=wb.active           
for n in range(3,zahl//2,10):
    i = i+1
    pendant=zahl-n-4
    laufv=zahl-pendant-4
    liste_laufv=ermittel_primteiler(laufv)
    liste_pendant=ermittel_primteiler(pendant)
    PTlaufv=""
    for x in liste_laufv:
        PTlaufv = PTlaufv+str(x)+", "
    PTpendant=""
    for y in liste_pendant:
        PTpendant = PTpendant+str(y)+", "
    ws.append([i,pendant,PTpendant,len(liste_pendant),laufv,PTlaufv,len(liste_laufv)])
wb.save("test1excel.xlsx")

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 18:28
von __blackjack__
@Bykl: Also mal abgesehen davon das `PTlaufv` ein wirklich schlechter Name ist, gibt es die `join()`-Methode auf Zeichenketten für so etwas.

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 18:52
von Sirius3
@Bykl: es ist müsig, immer wieder das selbe schreiben zu müssen. Benutze keine Abkürzungen, und schreibe Variablennamen komplett klein. Soll laufv wirklich laufvariable heißen? Einen nichtsagenderen Namen hast Du nicht gefunden?
Wenn pendant = zahl-n-4 ist und laufv = zahl - pendant - 4 ist, dann kann man das einfach einsetzen und bekommt laufv = zahl - (zahl-n-4) - 4 = zahl - zahl + n + 4 - 4 also laufv = n.
Strings setzt man nicht per + zusammen, sondern benutzt str.join.
x bzw y für ganze Zahlen ist ungewöhnlich. `return` ist keine Funktion, die Klammern also unsinnig.
matplotlib und numpy, sieve und primepi werden nicht benutzt.

Code: Alles auswählen

from openpyxl import Workbook
from sympy.ntheory import isprime

def ermittel_primteiler(zahl):
    primteiler = []
    for i in range(3, zahl//2, 2):
        if zahl % i == 0 and isprime(i):
            primteiler.append(i)
    return primteiler

workbook = Workbook()
worksheet = workbook.active           
maximalzahl = 10000
for index, zahl in enumerate(range(3, maximalzahl // 2, 10), 1):
    pendant = maximalzahl - zahl - 4
    primteiler_pedant = ermittel_primteiler(pedant)
    primteiler_zahl = ermittel_primteiler(zahl)
    worksheet.append([index,
        pendant, ", ".join(map(str, primteiler_pedant)), len(primteiler_pedant),
        zahl, ", ".join(map(str, primteiler_zahl)), len(primteiler_zahl),
    ])
workbook.save("test1excel.xlsx")

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 19:21
von Bykl
@sirius die join-method hatte ich versucht. Sie war mein 1. Gedanke. Sie hat nicht funktioniert. Für die schlechte Namenswahl entschuldige ich mich. Es war auf die Schnelle passiert. Ich verändere das jetzt.

Man kann aber nicht alles mit einemmal behalten!

Code: Alles auswählen

from openpyxl import Workbook
from sympy.ntheory import isprime


wb = Workbook()
zahl=2000
ausgangs_zahl=0
i=0

def ermittel_primteiler(x):
    primteiler_liste=[]
    for i in range(3,x//2,2):
        if x%i==0 and isprime(i):
            primteiler_liste.append(i)
    return(primteiler_liste)

ws=wb.active           
for n in range(3,zahl//2,10):
    i = i+1
    pendant=zahl-n-4
    ausgangs_zahl=zahl-pendant-4
    liste_ausgangs_zahl=ermittel_primteiler(ausgangs_zahl)
    liste_pendant=ermittel_primteiler(pendant)
    pt_ausgangs_zahl=""
    for x in liste_ausgangs_zahl:
        pt_ausgangs_zahl = pt_ausgangs_zahl+str(x)+", "
    pt_pendant=""
    for y in liste_pendant:
        pt_pendant = pt_pendant+str(y)+", "
    ws.append([i,pendant,pt_pendant,len(liste_pendant),ausgangs_zahl,pt_ausgangs_zahl,len(liste_ausgangs_zahl)])
wb.save("test2excel.xlsx")
Jetzt fehlt nur noch die Idee, wie ich das letzte Komme in der PT-Zelle eleminiere? Fändet Ihr es besser, wenn ich den Code noch kommentiere?

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 20:29
von __blackjack__
@Bykl: Die `join()`-Methode funktioniert. Die ist nicht so ineffizient, und hat auch nicht das Problem das da ein Trenner zu viel hinten dran gepappt wird.

Grunddatentypen wie `liste` haben in Namen eher nichts zu suchen. Denn wenn man den Datentyp ändert, beispielsweise weil ein vorhandener Datentyp besser passt oder man sich einen passenden selbst schreibt, ist der Name falsch, obwohl sich die Bedeutung des Wertes gar nicht geändert hat. Und dann hat man entweder falsche, irreführende Namen im Programm stehen, oder man muss das überall im Programm ändern.

Das definieren der Variablen am Anfang ist zu weit von dem Code entfernt der diese Namen dann tatsächlich verwendet. Zudem hat das alles nichts auf Modulebene zu suchen, denn damit sind das ja globale Variablen, die man nicht haben will.

`i` würde man besser mit der `enumerate()`-Funktion erzeugen, statt das manuell zu initialisieren und hoch zu zählen.

Re: Liste in Excel Zelle schreiben.

Verfasst: Samstag 29. August 2020, 20:40
von Sirius3
Warum poste ich wohl einen verbesserten Code? Das beantwortet schon Deine Frage.