嗨,怎么样?我正在尝试构建易于使用的函数,这些函数可以应用于 openpyxl 之上的 Excel 工作表。但我注意到,每当我将格式应用于单元格时,任何以前的格式都会被恢复。
例如,如果我有一个已经是粗体的列,并且我想将其添加下划线,如果我没有明确地说“再次使其加粗”和“使其加下划线”,则它将不再是粗体。
这是我的一些代码。有人能帮我吗?必须有一种方法来维护现有的格式,或者至少提取现有的格式并重新应用它。
from openpyxl import load_workbook
from openpyxl.styles import Font, Color, PatternFill, Border, Side
def bold_italic(wb, ws, path, rows=None, cols=None, bold=False, italic=False):
font_together = Font(bold=bold, italic=italic)
#Function for applying formatting
def apply_format(cell_range):
for row in cell_range:
for cell in row:
cell.font = font_together
if rows:
if isinstance(rows, int):
apply_format(ws.iter_rows(min_row=rows, max_row=rows))
elif isinstance(rows, list):
for row in rows:
apply_format(ws.iter_rows(min_row=row, max_row=row))
if cols:
if isinstance(cols, int):
apply_format(ws.iter_cols(min_col=cols, max_col=cols))
elif isinstance(cols, list):
for col in cols:
apply_format(ws.iter_cols(min_col=col, max_col=col))
wb.save(path)
def font_size_color(wb, ws, path, rows=None, cols=None,font_name=None, font_size=None, font_color=None):
font_together = Font(name=font_name, size=font_size, color=font_color)
# Function to apply font formatting
def apply_font(cell_range):
for row in cell_range:
for cell in row:
cell.font = font_together
if rows:
if isinstance(rows, int):
apply_font(ws.iter_rows(min_row=rows, max_row=rows))
elif isinstance(rows, list):
for row in rows:
apply_font(ws.iter_rows(min_row=row, max_row=row))
if cols:
if isinstance(cols, int):
apply_font(ws.iter_cols(min_col=cols, max_col=cols))
elif isinstance(cols, list):
for col in cols:
apply_font(ws.iter_cols(min_col=col, max_col=col))
# Save the workbook
wb.save(path)
path = 'Book.xlsx'
workbook = load_workbook(path)
worksheet = workbook['SHEET_1']
bold_italic(workbook,worksheet, path,rows=2,cols=[2,3],bold=True)
font_size_color(workbook,worksheet, path,rows=1,cols=[2,3],font_name='Arial',font_size=12, font_color = "FF0000")
在上面的代码中,如果运行它,最终结果将是第 2 列和第 3 列不是粗体,因为第二个函数调用改变了文本的字体、大小和颜色。
您可以在修改之前阅读格式:
def modify_font(wb, ws, pth, rows=None, cols=None,
bold=None, italic=None, font_name=None, font_size=None, font_color=None):
def apply_font(cell_range):
for row in cell_range:
for cell in row:
existing_font = cell.font
new_font = Font(bold=bold if bold is not None else existing_font.bold,
italic=italic if italic is not None else existing_font.italic,
name=font_name if font_name is not None else existing_font.name,
size=font_size if font_size is not None else existing_font.size,
color=font_color if font_color is not None else existing_font.color)
cell.font = new_font
if rows:
if isinstance(rows, int):
apply_font(ws.iter_rows(min_row=rows, max_row=rows))
elif isinstance(rows, list):
for row in rows:
apply_font(ws.iter_rows(min_row=row, max_row=row))
if cols:
if isinstance(cols, int):
apply_font(ws.iter_cols(min_col=cols, max_col=cols))
elif isinstance(cols, list):
for col in cols:
apply_font(ws.iter_cols(min_col=col, max_col=col))
按照@iBeMeltin的建议,我合并了这两个函数以给出完整的示例。