我正在使用win32com.client将数据写入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
答案 0 :(得分:3)
一些建议:
关闭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]
另一种方法
考虑使用openpyxl或xlwt。 Openpyxls允许您在不安装Excel的情况下创建.xlsx
个文件。 Xlwt对.xls
文件做了同样的事情。
答案 1 :(得分:1)
使用了另一个答案的范围建议,我写道:
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],
])
答案 2 :(得分:1)
请注意,您可以使用以下代码轻松地通过数字地址设置范围:
cl1 = Sheet1.Cells(X1,Y1)
cl2 = Sheet1.Cells(X2,Y2)
Range = Sheet1.Range(cl1,cl2)