Daten aus Excel auslesen

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.
BlackJack

eiwolf hat geschrieben:ja sobald ein umlaut enthalten ist, ist es ein Zellenobjekt oder so? Solange kein umlaut enthalten ist funzt es problemlos.
Das kann ich mir kaum vorstellen. Finde besser mal heraus was es *wirklich* für ein Typ ist. Die `type()` Funktion sollte dabei helfen.
eiwolf
User
Beiträge: 9
Registriert: Mittwoch 16. August 2006, 11:10

Ich hab jetzt mal die type() funktion benutzt. In der Konsole wird "<type 'instance'>" ausgegeben.

Code: Alles auswählen

class Excel:
    def __init__(self,excelpath,Sheet):
        self.excelobj = win32com.client.Dispatch("Excel.Application")
        self.excelobj.Visible = True        
        self.wb = self.excelobj.Workbooks.Open(Filename = excelpath, ReadOnly = True)
        self.ws = self.wb.Sheets(Sheet)         
    def ReturnValue(self,Line,Row):
        print type(self.ws.Range(Line+Row)) 
        return self.ws.Range(Line+Row)
    def close(self):
        del excelobj
BlackJack

Also ist es schon mal keine Zeichenkette. Mit `obj.__class__.__name__` kannst Du herausfinden wie die Klasse heisst und mit `dir(obj)` welche Methoden es gibt.
eiwolf
User
Beiträge: 9
Registriert: Mittwoch 16. August 2006, 11:10

Super...Danke.

Auf zur nächsten Runde: Konsolenausgaben siehe komentare...

Code: Alles auswählen

class Excel:
    def __init__(self,excelpath,Sheet):
        self.excelobj = win32com.client.Dispatch("Excel.Application")
        self.excelobj.Visible = True        
        self.wb = self.excelobj.Workbooks.Open(Filename = excelpath, ReadOnly = True)
        self.ws = self.wb.Sheets(Sheet)
                 
    def ReturnValue(self,Line,Row):
        print type(self.ws.Range(Line+Row))  # <type 'instance'>
        print self.ws.__class__.__name__    #CDispatch
        print dir(self.ws)                                # siehe weiter unten
        print self.ws._unicode_to_string_      #false
        
        return self.ws.Range(Line+Row)
    def close(self):
        del excelobj
Mit dem CDispatch kann ich leider nichts anfangen....

Ausgabe von dir(self.ws):

['_ApplyTypes_', '_FlagAsMethod', '_LazyAddAttr_', '_NewEnum', '_Release_', '__AttrToID__', '__LazyMap__', '__call__', '__cmp__', '__doc__', '__getattr__', '__getitem__', '__init__', '__int__', '__len__', '__module__', '__nonzero__', '__repr__', '__setattr__', '__setitem__', '__str__', '_builtMethods_', '_enum_', '_find_dispatch_type_', '_get_good_object_', '_get_good_single_object_', '_lazydata_', '_make_method_', '_mapCachedItems_', '_oleobj_', '_olerepr_', '_print_details_', '_proc_', '_unicode_to_string_', '_username_', '_wrap_dispatch_']

kann ich leider auch nichts damit anfangen - hab auch schon die Hilfe benutzt, aber nichts brauchbares gefunden...

Danke für deine Geduld BlackJack - ich seh schon ich kann (muss) noch viel lernen.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Soweit ich weiß gibt Range() immer ein Range-Objekt zurück. Dass man sich bei Excel nicht darauf verlassen kann, ist für mich auch keine Überraschung. :? Ich lese Werte aus einzelnen Zellen in dieser Art:

Code: Alles auswählen

self.ws.Cells(y, x).Value
Wobei ich noch eine kleine Funktion geschrieben habe, die mir die Spaltennamen in Zahlen umwandelt, denn x und y in obigem Beispiel müssen Zahlenkoordinaten sein.

HTH

edit: nochmal in der Hilfe nachgelesen, dort steht
Range-Eigenschaft, wie sie auf die Objekte Application, Range und Worksheet angewendet wird.

Gibt ein Range-Objekt zurück, das eine Zelle oder einen Zellbereich darstellt.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
eiwolf
User
Beiträge: 9
Registriert: Mittwoch 16. August 2006, 11:10

danke - es geht :-)
Antworten