Newbie: returning dynamicly built lists (using win32com)

2006-06-06 Thread Ransom
Very newb here, but my question will hopefully be obvious to someone.

Code:

import string
from win32com.client import Dispatch
docdir = 'E:\\scripts\\Python\\RSAutomation\\'

def getOldData(testcases):

excel = Dispatch("Excel.Application")
excel.Workbooks.Open(docdir + 'FILE.xls')

# load and create list from file (testcases.csv)
for rsinput in testcases.xreadlines():

inputlist = string.split(rsinput, ',')


# iterate through and update spreadsheet input
cellx = range(3,51)
values = range(0,48)
for i,r in zip(cellx, values):

excel.ActiveSheet.Cells(i,2).Value = inputlist[r]

# TODO: read output from cell 32,6 into a tuple or list and
then return list to __main__

[THIS IS WHERE I AM HAVING A PROBLEM]
print excel.ActiveSheet.Cells(32,6)   <--This prints properly
as loop executes

excel.ActiveWorkbook.Close(SaveChanges=0)
excel.Quit()

if __name__ == "__main__":
csv_testcases = open('arse_testcases.csv','r')
getOldData(csv_testcases)

OK, so what is happening is that I am sending a list of data to an
overly complicated spreadsheet that produces it's own output (in cell
32,6). As I loop through multiple test cases, the print statement
calling into COM for the cell data seems to be printing out results
just fine. But when I try and put the output from the spreadsheet into
a dynamic list after the TODO section thusly:

outputlist = []
outputlist.extend(excel.ActiveSheet.Cells(32,6)
return outputlist

I get an error like:
[]

I need to be able to return the dynamically generated built up by the
responses from the spreadsheet lookup call (the exce.Activesheet
thingy). Is there a better way to get this dynamically built list out
of the funtion?

Thanks!!!

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: returning dynamicly built lists (using win32com) (SOLVED)

2006-06-06 Thread Ransom
Thanks folks! I had just gotten myself into a blind rut, apparently.
Adding the .Value attribute to the com object does strip all the other
messaging returning from Excel so I could then populate my list and
return out of the function normally.

I had tried that earlier, but had used the .Value attribute incorrectly
( Cells.Value(x,y) instead of Cells(x.y).Value.

Cheers,
G




Ransom wrote:
> Very newb here, but my question will hopefully be obvious to someone.
>
> Code:
>
> import string
> from win32com.client import Dispatch
> docdir = 'E:\\scripts\\Python\\RSAutomation\\'
>
> def getOldData(testcases):
>
> excel = Dispatch("Excel.Application")
> excel.Workbooks.Open(docdir + 'FILE.xls')
>
> # load and create list from file (testcases.csv)
> for rsinput in testcases.xreadlines():
>
> inputlist = string.split(rsinput, ',')
>
>
> # iterate through and update spreadsheet input
> cellx = range(3,51)
> values = range(0,48)
> for i,r in zip(cellx, values):
>
> excel.ActiveSheet.Cells(i,2).Value = inputlist[r]
>
> # TODO: read output from cell 32,6 into a tuple or list and
> then return list to __main__
>
> [THIS IS WHERE I AM HAVING A PROBLEM]
> print excel.ActiveSheet.Cells(32,6)   <--This prints properly
> as loop executes
>
> excel.ActiveWorkbook.Close(SaveChanges=0)
> excel.Quit()
>
> if __name__ == "__main__":
> csv_testcases = open('arse_testcases.csv','r')
> getOldData(csv_testcases)
>
> OK, so what is happening is that I am sending a list of data to an
> overly complicated spreadsheet that produces it's own output (in cell
> 32,6). As I loop through multiple test cases, the print statement
> calling into COM for the cell data seems to be printing out results
> just fine. But when I try and put the output from the spreadsheet into
> a dynamic list after the TODO section thusly:
>
> outputlist = []
> outputlist.extend(excel.ActiveSheet.Cells(32,6)
> return outputlist
>
> I get an error like:
> [ 0x15450880>]
>
> I need to be able to return the dynamically generated built up by the
> responses from the spreadsheet lookup call (the exce.Activesheet
> thingy). Is there a better way to get this dynamically built list out
> of the funtion?
> 
> Thanks!!!

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: returning dynamicly built lists (using win32com)

2006-06-06 Thread Ransom
> 1. First of all, this is not the code you are running.  I know this because
> the unbalanced parens wont even compile.  It really doesn't help when you
> ask for help, but post the wrong code.

"Ok! Ok! I must have, I must have put a decimal point in the wrong
place
or something. Shit. I always do that. I always mess up some mundane
detail."
-Michael Bolton

Actually, this was a typo in my e-mail.  And yes, I realize how
annoying that can be when someone is seeking help. Thanks for your
otherwise excellent response, though!

G


Paul McGuire wrote:
> "Ransom" <[EMAIL PROTECTED]> wrote in message
> news:[EMAIL PROTECTED]
> > Very newb here, but my question will hopefully be obvious to someone.
> 
> > But when I try and put the output from the spreadsheet into
> > a dynamic list after the TODO section thusly:
> >
> > outputlist = []
> > outputlist.extend(excel.ActiveSheet.Cells(32,6)
> > return outputlist
> >
> > I get an error like:
> > [ > 0x15450880>]
> >
>
> 1. First of all, this is not the code you are running.  I know this because
> the unbalanced parens wont even compile.  It really doesn't help when you
> ask for help, but post the wrong code.
>
> 2. What you are getting is NOT an error.  Read it very carefully.  What you
> have added to outputlist is a Range object.  Look into the Excel COM
> documentation (you can open up VB from Excel by pressing Alt-F11, then open
> the Object Browser to see the object API) for how to access the methods and
> properties of an Excel Range.  I'm guessing one of the properties Value,
> Value2, Text, or Formula will give you what you want.
>
> 3. The reason your print statement appears to work is because print
> implicitly applies the str method to objects, while applying the repr method
> to contents of a list.  So "print excel.ActiveSheet.Cells(32,6)" will output
> "42" or whatever - for grins, try "print
> type(excel.ActiveSheet.Cells(32,6))"  (taking care to insert enough parens
> :) )
>
> All that is gold does not glitter, not all who wander are lost, don't judge
> a book by its cover, or a variable by its output, etc...
> 
> -- Paul

-- 
http://mail.python.org/mailman/listinfo/python-list


occasional win32com error

2006-06-15 Thread Ransom
Hey folks...

Newbie here. I'm working with win32com launching, closing and
re-launching Excel grabbing output and doing stuff.

Well, on some occasions, I get the following error:


Traceback (most recent call last):
  File "checkrates.py", line 95, in ?
newdata = getNewData(testcases1)
  File "checkrates.py", line 62, in getNewData
excel.Workbooks.Open(docdir + 'TOSrat2006_09.xls')
  File "C:\Python24\lib\site-packages\win32com\client\dynamic.py", line
496, in __getattr__
raise AttributeError, "%s.%s" % (self._username_, attr)
AttributeError: Excel.Application.Workbooks

Sometimes the code runs fine. Sometimes I get this error. The code in
question is:

import string
from win32com.client import Dispatch
docdir = 'E:\\scripts\\Python\\RSAutomation\\'


def getOldData(testcases):
   #open excel
excel = Dispatch("Excel.Application")
excel.Workbooks.Open(docdir + 'TOSrat2006_07.xls')

oldoutputlist = []
for rsinput in testcases.xreadlines():

inputlist = string.split(rsinput, ',')

# iterate through and update spreadheet input
cellx = range(3,51)
values = range(0,48)
for i,r in zip(cellx, values):

excel.ActiveSheet.Cells(i,2).Value = inputlist[r]

#read spreadsheet output and cat to outputlist
premium = excel.ActiveSheet.Cells(32,6).Value
oldoutputlist.append(premium)
# close up excel
excel.ActiveWorkbook.Close(SaveChanges=0)
excel.Quit()
del excel
return oldoutputlist

def getNewData(testcases):
# open excel
excel = Dispatch("Excel.Application")
excel.Workbooks.Open(docdir + 'TOSrat2006_09.xls')
newoutputlist = []
for rsinput in testcases.xreadlines():

inputlist = string.split(rsinput, ',')

# iterate through and update spreadsheet input
cellx = range(3,51)
values = range(0,48)
for i,r in zip(cellx, values):

excel.ActiveSheet.Cells(i,2).Value = inputlist[r]

# read ratesheet output and cat to outputlist
premium = excel.ActiveSheet.Cells(32,6).Value
newoutputlist.append(premium)
excel.ActiveWorkbook.Close(SaveChanges=0)
excel.Quit()
del excel
return newoutputlist

if __name__ == "__main__":
testcases = open('arse_testcases.csv','r')
testcases1 = open('arse_testcases.csv','r')
olddata = getOldData(testcases)
newdata = getNewData(testcases1)

print olddata
print newdata


It seems like Python or COM is having a hard time freeing up (or
closing down) excel prior to the "getNewData" function running and it
is stepping on itself. I thought the stuff I'm doing at the end of
getOldData should successfully shut down excel.

Any advice, criticism, flames are appreciated. 

Cheers!

-- 
http://mail.python.org/mailman/listinfo/python-list