Array schreiben, um in Python mit win32com zu glänzen

Ich mache eine Python, die Datendateien analysiert. Die analysierten Daten werden dann an eine Excel-Datei gesendet. Die Daten können sehr groß sein. Ich betrachte 10 bis 20 Spalten, aber die Anzahl der Zeilen kann weit über 100.000 liegen.

Das Schreiben dieser Datenmenge mit win32com nimmt viel Zeit in Anspruch. Mein erster Schritt war es, über jede Zelle in der Excel-Datei zu iterieren, was sehr zeitaufwendig ist. Nach einigem Graben habe ich herausgefunden, wie ich mit einem einzigen Aufruf eine Zeile schreiben kann, was den Zeitaufwand drastisch reduziert.

Wenn ich jedoch 100.000 Datenzeilen zum Übertreffen senden muss, wird es immer noch viel Zeit in Anspruch nehmen. Ich bin mir ziemlich sicher, dass ich dies weiter beschleunigen kann, indem ich das gesamte Array mit einem einzigen Anruf sende. Das kann ich aber noch nicht.

Beachten Sie den folgenden Code, der das Problem veranschaulicht. Der Code zeigt die zeitlichen Unterschiede. Der dritte Schritt, bei dem das gesamte Array mit einem einzigen Aufruf an einen Bereich gesendet wird, führt jedoch nicht zu den korrekten Daten in Excel. Was mache ich falsch?

import win32com.client
import time

#create data array
row = range(0,10)
i = 0
data_array = []
while i < 1000:
    data_array.append(row)
    i += 1

#write the array to an excel file
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True
excel.ScreenUpdating = False
book = excel.Workbooks.Add()
sh1 = book.Worksheets(1)
sh2 = book.Worksheets(2)
sh3 = book.Worksheets(3)

#double loop, writing individual cells
print "Writing with double loop to inidividual cells."
start = time.time()
row = 0
for line in data_array:
    row += 1
    col = 0
    for field in line:
        col += 1
        sh1.Cells(row, col).Value = field
print "Processing time: " + str(time.time() - start) + " seconds."

#single loop, writing a row to a range
print "Writing with double loop to inidividual cells."
start = time.time()
row = 0
for line in data_array:
    row += 1
    sh2.Range(sh2.Cells(row,1), sh2.Cells(row, len(line))).Value = line
print "Processing time: " + str(time.time() - start) + " seconds."

#no loop, write array to range
print "Writing with double loop to inidividual cells."
start = time.time()
try:
    sh3.Range(sh3.Cells(row,1), sh3.Cells(len(data_array), len(data_array[0]))).Value = data_array
    print "Processing time: " + str(time.time() - start) + " seconds."
except:
    print "Failed to write array to excel file."

excel.ScreenUpdating = True
sheet = None
book = None
excel.Quit()
excel = None

Antworten auf die Frage(3)

Ihre Antwort auf die Frage