python,如何填满整行? row(i).fill = PatternFill

时间:2016-11-23 14:03:48

标签: python

我的代码目前正在执行此操作,我想知道是否有更短的方法来编写它?

sheet.cell(row=i, column=3).fill = PatternFill(start_color='ff0000', end_color='ff0000', fill_type="solid")
sheet.cell(row=i, column=4).fill = PatternFill(start_color='ff0000', end_color='ff0000', fill_type="solid")
sheet.cell(row=i, column=5).fill = PatternFill(start_color='ff0000', end_color='ff0000', fill_type="solid")
sheet.cell(row=i, column=6).fill = PatternFill(start_color='ff0000', end_color='ff0000', fill_type="solid")

3 个答案:

答案 0 :(得分:2)

一个简单的循环可能吗?

for r in range(3, 7):
   sheet.cell(row = i, column = r).fill = PatternFill(start_color= 'ff0000', end_color= 'ff0000', fill_type = "solid")

如果您愿意,也可以将该配置移出循环,这可能会使配置更容易:

pfKwargs = {'start_color': 'ff0000', 'end_color': 'ff0000', 'fill_type': 'solid'}

for r in range(3, 7):
   sheet.cell(row = i, column = r).fill = PatternFill(**pfKwargs)

或者将其移动到一个函数中:

def addFills(sheet, start = 3, count = 4, start_color='ff0000', end_color='ff0000', fill_type="solid")
     for r in range(start, start + count):
        sheet.cell(row = i, column = r).fill = PatternFill(
                                                  start_color=start_color, 
                                                  end_color=end_color, 
                                                  fill_type=fill_type)

addFills(sheet) # does the same as the above.
addFills(sheet, 1, 200) # does the same as the above, starting at 1 and ending at 201
addFills(sheet, end_color='00ff00') # Same as above only green end color.

答案 1 :(得分:1)

你应该像这样使用for循环:

for col in xrange(3, 7):
    sheet.cell(row = i, column = col).fill = PatternFill(start_color= 'ff0000', end_color= 'ff0000', fill_type = "solid")

答案 2 :(得分:1)

您可以采用多种方法使您的代码更简单,更易于维护。

方法1.为填充使用有意义的变量名称

您可以使用循环,但有时您希望保持对每个单元格的更多控制。当格式化要求经常变化时尤其如此。在这种情况下,循环不太有用,你可能想要更明确的东西,如:

redFill = PatternFill(start_color='ff0000', end_color='ff0000', fill_type="solid")
sheet.cell(row=i, column=3).fill = redFill
sheet.cell(row=i, column=4).fill = redFill
sheet.cell(row=i, column=5).fill = redFill
sheet.cell(row=i, column=6).fill = redFill

通过使用有意义的变量(如redFill),可以使程序更易于维护。例如,稍后,您可能希望添加blueFill并仅更改几个单元格:

redFill = PatternFill(start_color='ff0000', end_color='ff0000', fill_type="solid")
blueFill = PatternFill(start_color='0000ff', end_color='0000ff', fill_type="solid")
sheet.cell(row=i, column=3).fill = blueFill
sheet.cell(row=i, column=4).fill = redFill
sheet.cell(row=i, column=5).fill = redFill
sheet.cell(row=i, column=6).fill = blueFill

(您可能已经注意到这种新的格式要求刚刚打破了基于循环的解决方案。)

方法2.使用具有有意义名称的常量和小函数

此示例引入了有意义的常量REDBLUE,因此您的代码不需要在整个过程中对“魔术常量”进行硬编码。 https://en.wikipedia.org/wiki/Magic_number_(programming)#Unnamed_numerical_constants

RED = "ff0000"
BLUE = "0000ff"
function solidFill(color):
  return PatternFill(start_color=color, end_color=color, fill_type="solid")


sheet.cell(row=i, column=3).fill = solidFill(RED)
sheet.cell(row=i, column=4).fill = solidFill(BLUE)
sheet.cell(row=i, column=5).fill = solidFill(RED)
sheet.cell(row=i, column=6).fill = solidFill(BLUE)

此实现的优势在于您只需添加一个新常量,就可以继续使用solidFill函数。但是,即便这样也不尽如人意。

选项3.梳理更高含义的功能

到目前为止,我们一直在尝试编写更少的Python代码。然而,随着时间的推移,这可能变得无法控制 - 就像一个孩子的乐高收藏品存放在一个大盒子里。

相反,如果我们退一步从更高的角度来看这个问题,我们可以问:“我们在这里真正想要完成什么?”答案可能类似于此代码示例:

RED = "ff0000"
BLUE = "0000ff"

function solidFill(color):
  return PatternFill(start_color=color, end_color=color, fill_type="solid")

function fillCell(row, column, color):
  sheet.cell(row=row, column=column).fill = solidFill(color)


fillCell(i, 3, RED)
fillCell(i, 4, BLUE)
fillCell(i, 5, BLUE)
fillCell(i, 6, RED)

我们仍然使用我们的低级函数solidFill,我们可以在其他需要 PatternFill 的情况下使用它。而且,总的来说,我们在这个例子中增加了行数。

但如果您需要填充30个不同的单元而不是4个单元,会发生什么?与原始行的108个字符相比,简单fillCell调用约20个字符。如果你手动输入它,它会很快变老。 (复制粘贴并不是一个很好的解决方案,但这是一个不同的主题。)

哪种方法最好?

务实,也许只选择适合您目的的方法。如果您试图预测明天的需求,很容易过度优化代码。但是,如果您已经拥有相当大的代码库,请继续选择模式,制作有意义的函数,并将它们应用于更短,更易读的程序。