
Edit (Leonidas): Topic verändert und verschoben.
Ich haette mal einen Vorschlag, wie die Benutzung des OOo-Moduls aussehen koennte:joerg hat geschrieben: ...Das sind also beste Voraussetzungen für ein solches Python-Modul. Vielleicht sollten wir mal grob entwerfen, wie die Struktur des/der Module ungefähr aussehen könnte. Ich denke, für den Anfang reicht es, wenn wir nur die Daten des Spreadsheets füllen, und später dann Funktionalität für die Formatierungen dazunehmen...
Code: Alles auswählen
from OOSpSheet import *
#Neue OOSpreadSheet Instanz
ooSpSheet=OOSpSheet()
#Sheet Instanz
sheet1=ooSpSheet.Sheets.Add()
#Sheet Eigenschaften
sheet1.name="OOoTestSheet"
#Sheet Daten
sheet1.Range("A1:C1").Value="11","12","13"
sheet1.Range("A2:C2").Value="21","22","23"
sheet1.Range("A3:C3").Value="31","32","33"
sheet1.Range("C4:C4").Value="=SUMME(C1:C3)"
#Exportpfad
ooSpSheet.ExportPath="/tmp/ooSpSheet.sxc"
#Export
ooSpSheet.Export()
Warum das Rad neu erfinden? Das Zuweisen/Holen von Werten über Indizes geht in Python prinzipiell über die eckigen Klammern, das kann man hier auch verwenden. Ich habe mal testweise eine SpreadSheet-Basisklasse gemacht, bei der man alternativ über Row/Column-Indizes oder symbolische Namen (Spaltenbuchstabe, Reihenzahl) gehen kann, auch mit Slices:tabellar hat geschrieben:Code: Alles auswählen
[...] sheet1.Range("A1:C1").Value="11","12","13" [...]
Ich bin nicht so vertraut mit Eurem Projekt, aber vielleicht hilft das Folgende ein Bisschen weiter:joerg hat geschrieben: Was noch nicht klappt, ist eine zuverlässige Namen<->Index-Umrechnung für alles ab 'Z'. Wer hat eine einfache Idee, wie man die typische Reihe A...Z,AA...AZ, BA...BZ einfach auf einen linearen Index umrechnet, und zurück?
Code: Alles auswählen
def int2letters(zahl):
return ("%s%s"%(' ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(zahl-1)/26],'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[(zahl % 26)-1])).strip()
def letters2int(str):
try:
return ((ord(str[-2]) - ord('A') + 1) * 26) + ord(str[-1]) - ord('A') + 1
except:
return ord(str[-1]) - ord('A') + 1
for i in range(1,28):
print i,int2letters(i),letter2int(int2letters(i))
for i in range(670,703):
print i,int2letters(i),letter2int(int2letters(i))
Der obige Code-Vorschlag ist an die Excel-COM Schnittstelle angelehnt...joerg hat geschrieben: Warum das Rad neu erfinden? Das Zuweisen/Holen von Werten über Indizes geht in Python prinzipiell über die eckigen Klammern, das kann man hier auch verwenden.
Code: Alles auswählen
...
s.Range['A1':'F12'].Font.Bold=1
...
Deine Lösung ist gut! Ich war an dem Problem irgendwie denkblockiert, wollte aber auch eine 'allgemeine Lösung' suchen. Aber Du hast recht, Übersetzungstabellen sind ca. um den Faktor 30..40 schneller...Jan hat geschrieben: Ich denke aber, wenn das ganze nur bis "ZZ" gehen soll, wären Übersetzungstabellen wesentlich performanter, in der einen Richtung als Liste und in die andere als Dictionary, auch wenn das gerade keine große Herausforderung ist
Jan - ab sofort nur noch als Gast, hab die Faxen dicke
Ich hab mir nochmal Gedanken ueber die Objektstruktur des Moduls gemacht. In OOo oder Excel weisen wir ja Zellenobjekte Werte zu(Value,Font,...). Sollten wir also nicht auch gleich von einer Zellen-Basisklasse ausgehen? Im Prinzip brauchen wir doch ZellObjekte, die in einem Bereichsobjekt gespeichert sind und auf die ueber entsprechende Methoden zugegriffen werden kann.joerg hat geschrieben: ... Ich habe mal testweise eine SpreadSheet-Basisklasse gemacht, bei der man alternativ über Row/Column-Indizes oder symbolische Namen (Spaltenbuchstabe, Reihenzahl) gehen kann, auch mit Slices:
...
Code: Alles auswählen
...
s.Cells('A1').Value='Hallo'
cell=s.Cells('1,2')
cell.Value='Joerg'
s.Cells('C7:C19').Value= range(13)
s.Cells('B1:B3').Value=['a','b','c']
s.Cells('A1:B2').Font='Arial'
s.Cells('A1:B2').Font.Bold=1
...
Hallo Jürgen,tabellar hat geschrieben: Die Objektstruktur in dem Modul koennte also dann vielleicht so aussehen:
document
.Sheets -> Sheet-Containerobjklasse
..Sheet -> Sheet-Objekt
...Cells -> Zellen-Containerklasse oder Bereichsobjekt(Range)
....Cell -> Zellen-Objekt
__________Code: Alles auswählen
... s.Cells('A1').Value='Hallo' cell=s.Cells('1,2') cell.Value='Joerg' s.Cells('C7:C19').Value= range(13) s.Cells('B1:B3').Value=['a','b','c'] s.Cells('A1:B2').Font='Arial' s.Cells('A1:B2').Font.Bold=1 ...
Juergen
Hallo Jörg,joerg hat geschrieben: ...Ich spiele noch ein bißchen rum, dann gebe ich meinen Code raus, in den nächsten Tagen, ok?
Hätte denn jemand ein bißchen Webspace und FTP-Zugang für die ersten Fragmente des Projektes?
Code: Alles auswählen
class Cell:
...
Code: Alles auswählen
class CellProxy:
...