Python – excel: запись в несколько ячеек занимает время

Я использую 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 

3 Solutions collect form web for “Python – excel: запись в несколько ячеек занимает время”

Несколько советов:

ScreenUpdating off, ручной расчет

Попробуйте следующее:

 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 позволяет создавать файлы .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) 
Python - лучший язык программирования в мире.