Seite 1 von 2

Verfasst: Mittwoch 16. August 2006, 21:20
von 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.

Verfasst: Donnerstag 17. August 2006, 08:36
von eiwolf
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

Verfasst: Donnerstag 17. August 2006, 09:26
von 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.

Verfasst: Donnerstag 17. August 2006, 10:27
von eiwolf
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.

Verfasst: Donnerstag 17. August 2006, 10:50
von N317V
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.

Verfasst: Donnerstag 17. August 2006, 14:47
von eiwolf
danke - es geht :-)