使用Openpyx对单元格区域应用边框

2024-04-28 12:40:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python 2.7.10和openpyxl2.3.2,我是一个python新手。

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

AttributeError: 'Cell' object has no attribute 'styles'.

如何将边框附加到单元格?如有任何见解,将不胜感激。

我的当前代码:

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

Tags: forwsstylesidethinrowscolorrow
2条回答

首先,属性称为style(不是styles)和border(不是borders)。也要更改边框,您应该直接设置cell.border

除了边界逻辑有一些问题外,由于迭代器和角点的存在,要使边界逻辑正常工作更为复杂。下面是一个粗略的版本(它尽可能简单,但不是内存高效的):

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)

可替换为:

border = cell.border.copy()

你的回答帮了我。。。

相关问题 更多 >