如何使用 openpyxl 修改 Excel 工作表的格式而不覆盖任何现有格式样式

问题描述 投票:0回答:1

嗨,怎么样?我正在尝试构建易于使用的函数,这些函数可以应用于 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 列不是粗体,因为第二个函数调用改变了文本的字体、大小和颜色。

python pandas openpyxl excel-automation pyexcel
1个回答
0
投票

您可以在修改之前阅读格式:

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的建议,我合并了这两个函数以给出完整的示例。

© www.soinside.com 2019 - 2024. All rights reserved.