Python - Excel:写入多个单元格耗时

5 投票
3 回答
4403 浏览
提问于 2025-04-16 11:55

我正在使用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

3 个回答

1

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

cl1 = Sheet1.Cells(X1,Y1)
cl2 = Sheet1.Cells(X2,Y2)
Range = Sheet1.Range(cl1,cl2)
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],
                        ])
4

这里有几个建议:

关闭屏幕更新,手动计算

可以尝试以下方法:

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

一次性赋值多个单元格

使用VBA(Visual Basic for Applications),你可以把一个范围的值设置为一个数组。一次性设置多个值可能会更快:

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

我没有用Python尝试过这个,建议你试试类似这样的代码:

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

另一种方法

可以考虑使用openpyxl或者xlwt。Openpyxl让你可以在没有安装Excel的情况下创建.xlsx文件。Xlwt则是用来处理.xls文件的。

撰写回答