Python - excel : writing to multiple cells takes time

后端 未结 3 1272
没有蜡笔的小新
没有蜡笔的小新 2021-02-10 14:40

I\'m using win32com.client to write data to an excel file. This takes too much time (the code below simulates the amount of data I want to update excel with, and it takes ~2 sec

相关标签:
3条回答
  • 2021-02-10 15:08

    used the range suggestion of the other answer, I wrote this:

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

    you may also write multiple lines at once:

    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 讨论(0)
  • 2021-02-10 15:11

    A few suggestions:

    ScreenUpdating off, manual calculation

    Try the following:

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

    Assign several cells at once

    Using VBA, you can set a range's value to an array. Setting several values at once might be faster:

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

    I have never tried this using Python, I suggest you try something like:

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

    A different approach

    Consider using openpyxl or xlwt. Openpyxls lets you create .xlsx files without having Excel installed. Xlwt does the same thing for .xls files.

    0 讨论(0)
  • 2021-02-10 15:30

    Note that you can set ranges via numeric adresses easily by using the following code:

    cl1 = Sheet1.Cells(X1,Y1)
    cl2 = Sheet1.Cells(X2,Y2)
    Range = Sheet1.Range(cl1,cl2)
    
    0 讨论(0)
提交回复
热议问题