2011-02-16 32 views
2

我正在使用win32com.client將數據寫入excel文件。 這花費了太多時間(下面的代碼模擬了我想要更新的數據量,並且需要大約2秒)。Python - excel:寫入多個單元格需要時間

有沒有辦法在一次調用中更新多個單元格(使用不同的值)而不是逐個填充它們?或者可能使用更有效的不同方法?

我使用Python 2.7版和Office 2010的

這裏是代碼:

from win32com.client import Dispatch 

xlsApp = Dispatch('Excel.Application') 
xlsApp.Workbooks.Add() 
xlsApp.Visible = True 
workSheet = xlsApp.Worksheets(1) 

for i in range(300): 
    for j in range(20): 
     workSheet.Cells(i+1,j+1).Value = (i+10000)*j 
+0

如果300更新需要〜2000毫秒,那麼單個更新的6毫秒似乎非常r對我來說合情合理。 – Axarydax

回答

2

幾點建議:

ScreenUpdating關,人工計算

嘗試如下:

xlsApp.ScreenUpdating = False 
xlsApp.Calculation = -4135 # manual 
try: 
    # 
    worksheet = ... 
    for i in range(...): 
    # 
finally: 
    xlsApp.ScreenUpdating = True 
    xlsApp.Calculation = -4105 # automatic 

分配多個小區同時

使用VBA,可以將範圍的值設置爲一個數組。同時設置幾個值可能會更快:

' VBA code 
ActiveSheet.Range("A1:D1").Value = Array(1, 2, 3, 4) 

這個使用Python我從來沒有嘗試過,我建議你嘗試類似:

worksheet.Range("A1:D1").Value = [1, 2, 3, 4] 

一種不同的方法

考慮使用openpyxlxlwt。 Openpyxls允許您在未安裝Excel的情況下創建.xlsx文件。 Xlwt對.xls文件做同樣的事情。

+0

你知道-4135和-4105從哪裏來?你從中得到了什麼文件。工作對我很好,只是好奇 – mrob

0

使用對方的回答範圍的建議,我寫了這個:

def writeLineToExcel(wsh,line): 
    wsh.Range("A1:"+chr(len(line)+96).upper()+"1").Value=line 

xlApp = Dispatch("Excel.Application") 
xlApp.Visible = 1 
xlDoc = xlApp.Workbooks.Open("test.xlsx") 
wsh = xlDoc.Sheets("Sheet1") 
writeLineToExcel(wsh,[1, 2, 3, 4]) 

你也可以一次寫多行:

def writeLinesToExcel(wsh,lines): # assume that all lines have the same length 
    wsh.Range("A1:"+chr(len(lines)+96).upper()+str(len(lines[0]))).Value=lines 

writeLinesToExcel(wsh,[ [1, 2, 3, 4], 
         [5, 6, 7, 8], 
         [9, 10,11,12], 
         [13,14,15,16], 
         ]) 
+0

這隻適用於該行有26個或更少的條目。當有更長的值集時,範圍地址需要爲:'chr(len(line)/ 26 + 96).upper()+ chr(len(line)%26 + 96).upper()' – rcriii

0

請注意,您可以通過數字不會忽略輕鬆設置範圍通過使用以下代碼:

cl1 = Sheet1.Cells(X1,Y1) 
cl2 = Sheet1.Cells(X2,Y2) 
Range = Sheet1.Range(cl1,cl2) 
相關問題