2012-08-06 108 views
4

我正在嘗試使用pywin32庫向Excel電子表格寫入大量數據。作爲我正面臨的問題的一個簡單示例,請使用以下代碼生成一個1000單元x 1000單元乘法表。pywin32和excel。編寫大量數據時出現異常

import win32com.client 
from win32com.client import constants as c 

xl = win32com.client.gencache.EnsureDispatch("Excel.Application")        
xl.Visible = True 
Workbook = xl.Workbooks.Add() 
Sheets = Workbook.Sheets 

tableSize = 1000 

for i in range(tableSize): 
    for j in range(tableSize): 
     Sheets(1).Cells(i+1, j+1).Value = i*j 

對於較小的值可以使用。然而,對於較大值的Python程序最終與錯誤崩潰:

Traceback (most recent call last): 
    File ".\Example.py", line 16, in <module> 
    Sheets(1).Cells(i+1, j+1).Value = i*j 
    File "C:\PYTHON27\lib\site-packages\win32com\client\__init__.py", line 474, in __setattr__ 
    self._oleobj_.Invoke(*(args + (value,) + defArgs)) pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146777998), None) 

我已經承認由於失利,這是比xlwt顯著慢,但我仍然好奇發生了什麼導致這個錯誤。

+0

是較大的負值你把價值?我們談論的價值有多大? – Logan 2012-08-06 21:49:59

+0

不,它不是。程序應該輸入到電子表格中的最大值是1M,但它永遠不會達到那麼大。據我所知,大負數在某種程度上對應於表示一般錯誤的錯誤代碼。編輯:我已經做了其他搜索該錯誤代碼,並已發現一系列的問題,但似乎沒有什麼非常類似於我的事實,它是有關使用pywin32。 – 2012-08-06 22:00:32

+0

如果它幫助任何來這裏尋找解決這個問題的人。添加檢查並等待每個單元顯着增加了程序運行的時間和寫入的單元數量。例如(1).Cells(i + 1,j + 1).Value!= i * j:pass'但是,程序仍然會崩潰。 – 2012-08-07 14:47:29

回答

3

我想通了。

錯誤只發生在代碼運行時用戶與Excel窗口交互。在使用excel進行任何工作之前,通過添加xl.Interactive = False可以避免這種情況。如果這是在應用程序可見之前添加的,則不存在任何交互的機會。

所以最後的代碼是:

import win32com.client 
from win32com.client import constants as c 

xl = win32com.client.gencache.EnsureDispatch("Excel.Application") 
xl.Interactive = False 
xl.Visible = True 
Workbook = xl.Workbooks.Add() 
Sheets = Workbook.Sheets 

Sheets(1).Cells(1,2).Value = "Test" 
print Sheets(1).Cells(1,2).Value 

tableSize = 1000 

for i in range(tableSize): 
    for j in range(tableSize): 
      Sheets(1).Cells(i+1, j+1).Value = i*j 
+1

謝謝。你的解決方案也拯救了我。 – kstratis 2015-01-12 13:30:04

相關問題