我想使用 openpyxl 将对齐应用于单元格范围?

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

我收到一个类型错误,表明单元格对象不可迭代。我知道我无法迭代对象,但我的困惑是我应该迭代什么来定义单元格的对齐方式。这是我的代码:

def File_formatting():
    wb = load_workbook(filename=output_file_path)
    ws = wb.worksheets[0]
    ws['B3'] = 'ERSC/VFD/OL configured'
    ws.merge_cells('B2:B3')
    ws['C3'] = 'Motor/VFD/Disc Faults'
    ws.merge_cells('C3:D3')
    ws['E3'] = 'Horns'
    ws.merge_cells('E3:F3')
    ws['G3'] = 'Runs'
    ws.merge_cells('G3:H3')
    ws['I3'] = 'ESTOPS'
    ws.merge_cells('I3:J3')
    ws['K3'] = 'Full(s)'
    ws.merge_cells('K3:L3')
    ws['M3'] = 'Implied Case Jam(s)'
    ws.merge_cells('M3:N3')
    ws['O3'] = 'Jam(s)'
    ws.merge_cells('O3:P3')
    ws['Q3']= 'Beacon Lights'
    ws.merge_cells('Q3:R3')
    ws['S3'] = 'Solenoids'
    ws.merge_cells('S3:T3')
    ws['U3']= 'misc Items'
    ws.merge_cells('U3:V3')
    ws['W3'] = 'Cascade'
    ws.merge_cells('W3:X3')
    ws['Y3']= 'Up/Down Conv ILKs'
    ws.merge_cells('Y3:Z3')
    ws['AA2'] = 'Final Sign Off'
    ws.merge_cells('AA2:AB2')
    ws['AA3'] = 'Test Date'
    ws['AB3'] = 'Engineer Initials'
    ws['AC1'] = '="Functional Check % Completion: " & TEXT( COUNTIF(AA4:AA149, ">1/1/1900")/COUNTA(A4:A149),"0.0%")'
    ws['A1'] = 'Put Checksheet name here'
    ws.merge_cells('A1:AB1')
    ws['C2'] = 'Operational Checkout'
    ws.merge_cells('C2:Z2')
    cell_ranges = ['B2:B3', 'C3:D3', 'E3:F3', 'G3:H3', 'I3:J3', 'K3:L3', 'M3:N3', 'O3:P3', 'Q3:R3',
                   'S3:T3', 'U3:V3', 'W3:X3', 'Y3:Z3', 'AA2:AB2', 'AA3:AB3', 'AC1']

    # Set alignment for specified cell ranges
    blue_fill = PatternFill(start_color='0000FF', end_color='0000FF', fill_type='solid')
    for cell_range in cell_ranges:
        for row in ws[cell_range]:
            for cell in row:
                cell.alignment = Alignment(horizontal='center', vertical='bottom')
                cell.fill = blue_fill
    wb.save(filename=output_file_path)

任何帮助将不胜感激。

我希望仅使用此函数来输出 Excel 文件的特定基本格式,并且我想在用户打开该函数之前为他们突出显示该函数。

python-3.x openpyxl
1个回答
0
投票

正如评论中提到的,当两个或多个单元格合并时,从技术上讲,只有左上角的单元格仍然存在于工作表中,而其他合并的单元格则不存在。
因此,没有必要格式化那些不存在的单元格,并且您的代码可以更改为仅格式化左上角的单元格,即列表 cell_ranges 可以更改为以下

cell_ranges = ['B2', 'C3', 'E3', 'G3', 'I3', 'K3', 'M3', 'O3', 'Q3', 'S3', 'U3', 'W3', 'Y3', 'AA2', 'AA3', 'AC1']

然后只需应用于这些单元格

def File_formatting():
    wb = load_workbook(filename=output_file_path)
    ws = wb.worksheets[0]

    ws['B3'] = 'ERSC/VFD/OL configured'
    ws.merge_cells('B2:B3')
    ws['C3'] = 'Motor/VFD/Disc Faults'
    ws.merge_cells('C3:D3')
    ws['E3'] = 'Horns'
    ws.merge_cells('E3:F3')
    ws['G3'] = 'Runs'
    ws.merge_cells('G3:H3')
    ws['I3'] = 'ESTOPS'
    ws.merge_cells('I3:J3')
    ws['K3'] = 'Full(s)'
    ws.merge_cells('K3:L3')
    ws['M3'] = 'Implied Case Jam(s)'
    ws.merge_cells('M3:N3')
    ws['O3'] = 'Jam(s)'
    ws.merge_cells('O3:P3')
    ws['Q3']= 'Beacon Lights'
    ws.merge_cells('Q3:R3')
    ws['S3'] = 'Solenoids'
    ws.merge_cells('S3:T3')
    ws['U3']= 'misc Items'
    ws.merge_cells('U3:V3')
    ws['W3'] = 'Cascade'
    ws.merge_cells('W3:X3')
    ws['Y3']= 'Up/Down Conv ILKs'
    ws.merge_cells('Y3:Z3')
    ws['AA2'] = 'Final Sign Off'
    ws.merge_cells('AA2:AB2')
    ws['AA3'] = 'Test Date'
    ws['AB3'] = 'Engineer Initials'
    ws['AC1'] = '="Functional Check % Completion: " & TEXT( COUNTIF(AA4:AA149, ">1/1/1900")/COUNTA(A4:A149),"0.0%")'
    ws['A1'] = 'Put Checksheet name here'
    ws.merge_cells('A1:AB1')
    ws['C2'] = 'Operational Checkout'
    ws.merge_cells('C2:Z2')
    # cell_ranges = ['B2:B3', 'C3:D3', 'E3:F3', 'G3:H3', 'I3:J3', 'K3:L3', 'M3:N3', 'O3:P3', 'Q3:R3',
    #                'S3:T3', 'U3:V3', 'W3:X3', 'Y3:Z3', 'AA2:AB2', 'AA3:AB3', 'AC1']

    cell_ranges = ['B2', 'C3', 'E3', 'G3', 'I3', 'K3', 'M3', 'O3', 'Q3', 'S3', 'U3', 'W3',
                   'Y3', 'AA2', 'AA3', 'AC1']


    ### Set alignment for specified cell ranges
    blue_fill = PatternFill(start_color='0000FF', end_color='0000FF', fill_type='solid')
    # for cell_range in cell_ranges:
    #     for row in ws[cell_range]:
    #         for cell in row:
    #             cell.alignment = Alignment(horizontal='center', vertical='bottom')
    #             cell.fill = blue_fill

    for cell in cell_ranges:
        ws[cell].alignment = Alignment(horizontal='center', vertical='bottom')
        ws[cell].fill = blue_fill

    wb.save(filename=output_file_path)


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