如何减少这段代码的重复性? (openpyxl)

How to make this code less repetitive? (openpyxl)

我是一名教师,我正在制作一个程序来帮助自己对学生的成绩进行分类。这不是什么大问题,问题是,我这样做主要是为了练习编程。

# Name the first line
sheet['A1'] = 'Index'
sheet['B1'] = 'Name'
sheet['C1'] = 'Grade'

# Changes the style of the first line to bold
sheet['A1'].font = font_bold
sheet['B1'].font = font_bold
sheet['C1'].font = font_bold

# Widens the columns
sheet.column_dimensions['A'].width = 10 
sheet.column_dimensions['B'].width = 30
sheet.column_dimensions['C'].width = 30

# Aligns to center
sheet.cell('A1').alignment = Alignment(horizontal='center', vertical='center')
sheet.cell('B1').alignment = Alignment(horizontal='center', vertical='center')
sheet.cell('C1').alignment = Alignment(horizontal='center', vertical='center')

# Freeze the first row
sheet.freeze_panes = 'A2'

# Index number of the lines
i = 2

--

--

# function to calculate the grade
def grade():

您可能会注意到,这在某种程度上是重复的。代码的功能完全符合我的要求,但我想知道其他一些方法可以使它更...简洁。

记住变量 reach 很重要,因为接下来将启动一个函数,并且不久之后,While 循环。

本题代码中不相关的部分已用---省略。如果不知何故需要它们,我会编辑它们,但据我所知,它们不是。

提前致谢。

这是一个好的开始:

items = [
  {"sheet": "A1", "column": "A", "column_width": 10, "title": "Index"},
  {"sheet": "B1", "column": "B", "column_width": 30, "title": "Name"},
  {"sheet": "C1", "column": "C", "column_width": 30} "title": "Grade"},
]

for item in items:
    sheet[item["sheet"]] = item["title"]
    sheet[item["sheet"]].font = font_bold # always bold
    sheet.column_dimensions[item["column"]] = item["column_width"] # shared value
    sheet.cell(item["sheet"]).alignment = Alignment(horizontal='center', vertical='center') # shared value

Objects 和 DRY(不要重复自己)原则

一般来说,只要你有一些相同长度的并行数组并保留一些相关属性,这就很好地表明你可以组合这些属性并从中得到一个 object。 对于您的情况,我看到建议定义具有以下属性的 object Sheet:

  • 标题
  • 字体
  • column_dimensions
  • 细胞
  • ...

我会把整个事情分解成函数。

def name_column(cell, name):
    sheet[cell] = name

def style_name_column(cell, style):
    sheet[cell].font = style

def change_width(column, width):
    sheet.column_dimensions[column].width = width

def align_column(cell):
    sheet.cell(cell).alignment = Alignment(horizontal='center', vertical='center')

然后使用某种数据结构来循环并执行这些操作。

indexes_and_names = [['A1','Index']
                     ['B1','Name' ]
                     ['C1','Grade']]

for item in indexes_and_names:
    name_column(item[0], item[1])

然后对其他函数重复,或者使用更大的数据结构,例如 Jack 的字典。

您的代码将是可读的,并且易于维护。

openpyxl 提供了所有必要的功能来快速轻松地完成此操作。最好的方法是使用 named styles。您可以为 header 个单元格创建单一样式并使用循环应用它。

创建第一行:

ws.append(['Index', 'Name', 'Grade'])

创建相关样式:

header = NamedStyle(…)

将样式应用于第一行:

for cell in ws[1]:
    cell.style = header