使用openpyxl将范围应用于范围内的所有单元格

我有一个脚本,需要一个pandas数据框,并把它切成几百块,并保存每个块作为一个单独的Excel文件。 每个块将具有相同的列数,但行数不同。 我已经想出了如何将所有其他必要的格式应用到这些文件与openpyxl,但我还没有确定最快的方式来应用边界。 此外,我认为我只是没有正确应用边框,因为下面的代码(我怀疑不应该需要循环每个单元格)不适用任何边框。

from openpyxl.style import Border wb = load_workbook(filename = _fname) ws = wb.worksheets[0] for _row in ws.range('A1:L'+str(ws.get_highest_row() ) ): for _cell in _row: _cell.style.borders.left.border_style = Border.BORDER_THIN _cell.style.borders.right.border_style = Border.BORDER_THIN _cell.style.borders.top.border_style = Border.BORDER_THIN _cell.style.borders.bottom.border_style = Border.BORDER_THIN wb.save(_fname) 

所以这个代码可以工作 ,但是它并不适用我期望的边框(在Excel中默认的边框),并且它比我想要的要多得多。 我的期望是,我应该能够做到这样的事情:

 from openpyxl.style import Border wb = load_workbook(filename = _fname) ws = wb.worksheets[0] _range = ws.some_range_func('A1:L'+str(ws.get_highest_row() ) ): _range.style.borders.all_borders = Borders.BORDER_THIN 

这个function是否存在? 如果不是的话,是否有人可以请至less解释如何应用默认的边框样式,而不是这个稍厚的边框? Border.BORDER_THICK,Border.BORDER_MEDIUM,Border.BORDER_THIN或Border.BORDER_HAIR都不是正确的。

谢谢!

可能是这个方便:

 from openpyxl.reader.excel import load_workbook from openpyxl.style import Border def set_border(ws, cell_range): rows = ws.range(cell_range) for row in rows: row[0].style.borders.left.border_style = Border.BORDER_THIN row[-1].style.borders.right.border_style = Border.BORDER_THIN for c in rows[0]: c.style.borders.top.border_style = Border.BORDER_THIN for c in rows[-1]: c.style.borders.bottom.border_style = Border.BORDER_THIN #usage example: ws = load_workbook('example.xlsx').get_active_sheet() set_broder(ws, "C3:H10") 

它执行相当快。

@ user698585你的方法看起来不错,但是现在版本的openpyxl改变了实现,所以它不再工作。 所以这应该更新到例如

  ws.cell(row=1, column=1).style.border.top.border_style = borders.BORDER_MEDIUM 

但是它会导致错误,更改样式是不允许的。 作为一种解决方法,我只是定义了一个专用的样式,但它们只是现有样式和边框定义的重复 – 不是很好的解决scheme,只有在知道样式具有更改的单元时才有效。

  border_style = Style(font=Font(name='Console', size=10, bold=False, color=Color(openpyxl.styles.colors.BLACK)), fill=PatternFill(patternType='solid', fgColor=Color(rgb='00C5D9F1')), border=Border(bottom=Side(border_style='medium', color=Color(rgb='FF000000')))) 

如果你需要样式(边界…)pandasExcel数据框我的叉刚刚合并到主人https://github.com/pydata/pandas/pull/2370#issuecomment-10898427

至于你的边界问题。 一次设置所有边界不会在openpyxl中工作。

 In [34]: c.style.borders.all_borders.border_style = openpyxl.style.Border.BORDER_THIN In [36]: c.style 'Calibri':11:False:False:False:False:'none':False:'FF000000':'none':0:'FFFFFFFF':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':0:'thin':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'general':'bottom':0:False:False:0:'General':0:'inherit':'inherit' 

设置单独作品(“瘦”:“FF000000”)

 In [37]: c.style.borders.top.border_style = openpyxl.style.Border.BORDER_THIN In [38]: c.style Out[38]: 'Calibri':11:False:False:False:False:'none':False:'FF000000':'none':0:'FFFFFFFF':'FF000000':'none':'FF000000':'none':'FF000000':'thin':'FF000000':'none':'FF000000':'none':'FF000000':0:'thin':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'none':'FF000000':'general':'bottom':0:False:False:0:'General':0:'inherit':'inherit' 

也许是一个在openpyxl中的错误。 但是没有什么大不了的,只是在function上设置了底部,顶部,左侧,右侧

在openpyxl 2.3.5上的决定

 from openpyxl.styles import Border, Side def set_border(ws, cell_range): border = Border(left=Side(border_style='thin', color='000000'), right=Side(border_style='thin', color='000000'), top=Side(border_style='thin', color='000000'), bottom=Side(border_style='thin', color='000000')) rows = ws.range(cell_range) for row in rows: for cell in row: cell.border = border set_border(worksheet, 'A5:C10') 

似乎没有内置的任务,我们必须自己做一些步骤,比如:

 #need make conversion from alphabet to number due to range function def A2N(s,e): return range(ord(s), ord(e)+1) #B1 is the border you defined #Assume you trying border A1-Q1 ... A3-Q3 X = A2N('A','Q') #print X your_desired_sheet_range_rows = range(1,4) #need two loop to go through cells for row in your_desired_sheet_rows: for col in X: ca = chr(col) sheet[ca+str(row)].border=B1