Python модуль win32com.client. Для работы модуля нужен офис на машине?

Работаю с pandas. Для форматирования результирующих таблиц для человеческого глаза использую модуль win32com. Все работает. Вопрос - должен ли на машине, где будет работать программа, стоять офис, конкретно эксель? Для конкретности - кусочек примера форматирования.

import win32com.client
Excel = win32com.client.Dispatch("Excel.Application")
wb = Excel.Workbooks.Open("E:\\OneDrive\\..\\Trade_snapshot_.xlsx")

# REC sheet formating
ws_rec = wb.Worksheets("Sheet01")
to_color = ("01_", '10_', '20_')
for seached in to_color:
    ws_rec.Cells.Find(seached).Interior.ColorIndex = 4
ws_rec.Rows('1:1').WrapText = True
# 
ws_rec.Columns('B:AZ').ColumnWidth = 9.71
ws_rec.Rows("1:1").EntireRow.AutoFit

ws_rec.Range("B2").Select
wb.ActiveWindow.FreezePanes = True
ws_rec.Save

как мне кажется, openpyxl не в состоянии сделать такое форматирование. Например FreezePanes - для активного окна, а в документации даже нет такого раздела... Итого два вопроса:
1) для работы (скажем в интернете) нужен ли на машине установлен Excel / Windows
2) можно ли это переписать на openpyxl


P.S.: Первый вопрос отпал. pywin32, в которой живет win32com - только винда. Посему остается вторая часть. Как реализую - приведу код решения. ...


Ответы (1 шт):

Автор решения: MaxU

Рабочий пример:

import re
from openpyxl import load_workbook
from openpyxl.styles import Color, PatternFill, Font, Border

df = pd.DataFrame(np.random.randint(100, size=(20, 15)))
df.columns = [f"{col:02d}_col" for col in df.columns]
filename = r"c:\temp\test.xlsx"

# function definition: https://ru.stackoverflow.com/a/1098849/211923
df_to_excel_auto_fmt(df, filename, max_col_width=15, index=False)

def fill_conditionally(
        filename, search_regex, fill_color=None,
        min_row=1, max_row=None, min_col=1, max_col=None):
    if fill_color is None:
        fill_color = PatternFill(start_color='EE1111',
                                   end_color='EE1111',
                                   fill_type='solid')
    if isinstance(fill_color, str):
        fill_color = PatternFill(start_color=fill_color,
                                   end_color=fill_color,
                                   fill_type='solid')
    wb = load_workbook(filename)
    ws = wb.active
    for row in ws.iter_rows(min_row=min_row, max_row=max_row,
                            min_col=min_col, max_col=max_col):
        for cell in row:
            if re.search(search_pat, str(cell.value)):
                cell.fill = fill_color

    wb.save(filename)
    wb.close()

search_strings = ("01_", "05_", "10_")
search_pat = r"^(?:{})".format("|".join(search_strings))

fill_color = "CCFFFF"

fill_conditionally(
    filename=filename,
    search_regex=search_pat,
    fill_color=fill_color,
    min_row=1,
    max_row=1)

результат:

введите сюда описание изображения

→ Ссылка