如何减少这段代码的重复性? (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
我是一名教师,我正在制作一个程序来帮助自己对学生的成绩进行分类。这不是什么大问题,问题是,我这样做主要是为了练习编程。
# 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