Python-excel:写入多个单元格需要时间

Python-excel:写入多个单元格需要时间,python,excel,Python,Excel,我正在使用win32com.client将数据写入excel文件。 这需要花费太多的时间(下面的代码模拟了我想要更新excel的数据量,大约需要2秒钟) 有没有办法在一次调用中更新多个单元格(具有不同的值),而不是逐个填充?或者使用另一种更有效的方法 我正在使用python 2.7和office 2010 代码如下: from win32com.client import Dispatch xlsApp = Dispatch('Excel.Application') xlsApp.Work

我正在使用win32com.client将数据写入excel文件。 这需要花费太多的时间(下面的代码模拟了我想要更新excel的数据量,大约需要2秒钟)

有没有办法在一次调用中更新多个单元格(具有不同的值),而不是逐个填充?或者使用另一种更有效的方法

我正在使用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
一些建议:

屏幕更新关闭,手动计算

请尝试以下操作:

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]
另一种方法


考虑使用或。Openpyxls允许您创建
.xlsx
文件,而无需安装Excel。Xlwt对
.xls
文件也做了同样的事情。

使用另一个答案的范围建议,我写了以下内容:

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],
                        ])

请注意,您可以使用以下代码通过数字地址轻松设置范围:

cl1 = Sheet1.Cells(X1,Y1)
cl2 = Sheet1.Cells(X2,Y2)
Range = Sheet1.Range(cl1,cl2)

如果300次更新需要大约2000毫秒,那么对我来说,每次更新6毫秒是非常合理的。这只在行中有26个或更少的条目时有效。当有较长的值集时,范围地址需要:
chr(len(line)/26+96)。upper()+chr(len(line)%26+96)。upper()
您知道-4135和-4105来自哪里吗?你是从什么文件中得到这个的。对我来说很好,只是好奇而已