Быстрая настройка цвета большого числа ячеек Excel - PullRequest
0 голосов
/ 12 февраля 2019

Быстрая установка значений и цветов для большого числа ячеек Excel с помощью win32com

Мне нужно рассчитать значения и установить базовые цвета большого числа ячеек Excel.На практике значение каждой ячейки рассчитывается на основе информации в базе данных.Цвет ячейки устанавливается в соответствии с тем, как были рассчитаны данные.т.е. какие биты базы данных были использованы для вычисления значения.Будут значения, которые одинаковы, но рассчитаны разными способами.Фон ячейки будет окрашен, чтобы отразить используемый метод.

Рабочие листы на самом деле имеют размер 120 X 80, но я сделал свой пример 12 X 8 более легким в управлении.

Простая итерация по всемукаждая строка / столбец работает, но это ОЧЕНЬ медленно.Если рабочий лист виден, это займет 3-4 минуты.С минимизированным рабочим листом это идет немного быстрее возможно 1-2 минуты.Есть 13 листов, которые нуждаются в этих данных.Итак, мы говорим до часа, чтобы обновить.(Я говорю о всех 9600 ячейках ... но не о 96 в моем примере)

Без информации о цвете я могу установить весь диапазон в один (или пару кусков, и он будет очень быстрым.

Есть ли способ установить большое количество отдельных цветов фона ячейки одновременно.Так как я могу установить значения все сразу.

from win32com.client import Dispatch
import random

def CalcCellValue(row,col):
    value = random.randint(1,101)
    color = random.randint(0,3)
    return value , color

excel = Dispatch('Excel.Application')
wb = excel.Workbooks('book1.xlsx')
ws = wb.Worksheets("Sheet1")
Clr = [0xff00ff,0x00ff00,0xffff00,0x00ffff]

#The slow way 3-4 minutes / sheet
for row in range(12):
    for col in range(8):
        value, color = CalcCellValue(row,col)
        ws.Cells(row+1,col+1).Value = value
        ws.Cells(row+1,col+1).Interior.color = Clr[color]

#Fast way less than a second but no color information
celldata=[]      
for row in range(12):
    tmprow=[]
    for col in range(8):
        value,color = CalcCellValue(row,col)
        tmprow.append(value)
    celldata.append(tmprow)
ws.Range("A1:H12").Value = celldata
...