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 шт):
Рабочий пример:
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)
результат:
