2013-08-08 1 views
2

Я попытке вставить список списков в Excel (таким образом, что каждый внутренний список представляет собой строку, каждый имеет ту же длину) при помощи следующего вызова:win32com MemoryError попытке вставить данные в Excel

#Assume ws is correctly initialized to an excel worksheet object 
ws.Range(ws.Cells(1,1),ws.Cells(len(myList),len(myList[0]))).value = myList 

Списки myList содержат строки и numpy float и ints. Я получаю следующее сообщение об ошибке при попытке выполнить вызов выше:

Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 570, in __setattr__ 
    self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) 
MemoryError: CreatingSafeArray 

, что является причиной этого win32com.client MemoryError? Благодаря!

ответ

8

Я определил проблема была со значениями Numpy:

>>> #Initialize test list with 2 numpy float64 values 
>>> test = [numpy.float64(456),numpy.float64(456)] 
>>> #Attempting to insert a list containing only numpy data types will error 
>>> ws.Range(ws.Cells(1,1),ws.Cells(1,2)).value = test 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 570, in __setattr__ 
    self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) 
MemoryError: CreatingSafeArray 
>>> #Changing one of the values to any other standard python data type will allow the list to be inserted 
>>> test[1] = 'test' 
>>> ws.Range(ws.Cells(1,1),ws.Cells(1,2)).value = test 
# A list with multiple numpy data types will error upon insertion 
>>> test.append(numpy.int64(456)) 
>>> ws.Range(ws.Cells(1,1),ws.Cells(1,3)).value = test 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 570, in __setattr__ 
    self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) 
MemoryError: CreatingSafeArray 
>>> """ Conclusion: A list can be inserted only if all of the numpy data types are the same and there is a built-in data type in the list as well """ 
>>> test[2] = numpy.float64(test[2]) 
>>> ws.Range(ws.Cells(1,1),ws.Cells(1,3)).value = test 
>>> 

Моим решением было просто преобразовать все значения в моем списке строки перед вставкой, не гарантируя никаких типов данных даст мне проблемы.

+2

также работает кастинг на поплавках python. – comte

+0

Также случается, когда вы просто передаете единственное значение 'None', когда это неожиданно не поплавок, который вы так и думали. – BoarGules