如何使这段代码重复性降低? (openpyxl)

时间:2017-03-29 22:38:55

标签: python 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():

正如您可能注意到的那样,在某种程度上,这一切都是重复的。代码完全按照我的意愿运行,但我想知道一些其他的方法来使它更多... succint。

记住变量达到是很重要的,因为接下来一个函数将开始,并且很快就会出现While循环。

---省略了此问题代码的不相关部分。如果他们以某种方式需要我会编辑它们,但据我所知,它们不是。

提前谢谢。

4 个答案:

答案 0 :(得分:2)

对象和干(不要重复自己)原则

通常,只要你有一些相同长度的并行数组保留一些相关的属性,就可以很好地指示你可以组合这些属性并从中创建一个对象。 对于您的情况,我看到建议使用以下属性定义对象表:

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

答案 1 :(得分:1)

这是一个好的开始:

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

答案 2 :(得分:1)

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

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])

然后重复其他功能,或使用更大的数据结构,如杰克的字典。

您的代码将易读且易于维护。

答案 3 :(得分:0)

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

创建第一行:

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

创建相关风格:

header = NamedStyle(…)

将样式应用于第一行:

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