使用Openpyxl将边框应用于单元格范围

我使用python 2.7.10和openpyxl 2.3.2,我是一个Python新手。

我正在尝试将边框应用于Excel工作表中的指定范围的单元格(例如C3:H10 )。 我下面的尝试是失败的以下消息:

AttributeError:“单元格”对象没有属性“样式”。

如何将边框添加到单元格? 任何见解都会受到感谢。

我目前的代码:

 import openpyxl from openpyxl.styles import Border, Side def set_border(ws, cell_range): rows = ws.iter_rows(cell_range) for row in rows: row[0].styles.borders = Border(left=Side(border_style='thin', color="FF000000")) row[-1].styles.borders = Border(right=Side(border_style='thin', color="FF000000")) for c in rows[0]: c.styles.borders = Border(top=Side(border_style='thin', color="FF000000")) for c in rows[-1]: c.styles.borders = Border(bottom=Side(border_style='thin', color="FF000000")) # Example call to set_border wb = openpyxl.load_workbook('example.xlsx') ws = wb.get_sheet_by_name('Sheet1') set_border(ws, "B3:H10") 

首先,所有属性被称为style (不是styles )和border (不是borders )。 也要改变边界,你应该直接设置cell.border

除此之外,你还有一些边界逻辑问题,由于迭代器和angular落的原因,使它正确工作更为复杂。 这是一个粗略的版本(它是尽可能简单,但我不明白):

 def set_border(ws, cell_range): rows = ws[cell_range] side = Side(border_style='thin', color="FF000000") rows = list(rows) # we convert iterator to list for simplicity, but it's not memory efficient solution max_y = len(rows) - 1 # index of the last row for pos_y, cells in enumerate(rows): max_x = len(cells) - 1 # index of the last cell for pos_x, cell in enumerate(cells): border = Border( left=cell.border.left, right=cell.border.right, top=cell.border.top, bottom=cell.border.bottom ) if pos_x == 0: border.left = side if pos_x == max_x: border.right = side if pos_y == 0: border.top = side if pos_y == max_y: border.bottom = side # set new border only if it's one of the edge cells if pos_x == 0 or pos_x == max_x or pos_y == 0 or pos_y == max_y: cell.border = border 
 border = Border( left=cell.border.left, right=cell.border.right, top=cell.border.top, bottom=cell.border.bottom) 

可以replace为:

 border = cell.border.copy() 

PS:你的答案帮助我…