在OpenPyxl中为单元格添加边框

47 投票
6 回答
99160 浏览
提问于 2025-04-18 14:28

我正在尝试使用Openpyxl给一个单元格加边框,但我在最基本的“给任何单元格加任何类型的边框”这个任务上失败了。我试着从Openpyxl的文档中复制默认样式并进行修改,但结果是

TypeError:__init__() got an unexpected keyword argument 'superscript'

我还试着直接从另一个例子中复制代码(使用openpyxl给一系列单元格加边框),但那样也出现了

AttributeError: type object 'Border' has no attribute 'BORDER_THIN'

(即使我修正了拼写错误和导入不够的问题)。

有没有人知道如何在Python 3.3和OpenPyxl 2.0.4中加边框?我只想要一段代码,如果我把它复制粘贴到一个空白的脚本里,就能给工作簿中的任何单元格加上边框。

6 个回答

1

如果我想在一个单元格里只显示底部的边框,那么只需要在代码中提到单元格的底部边框,像下面的代码一样就可以了。

from openpyxl.styles.borders import Border, Side

wb = Workbook()
ws = wb.active

thin_border = Border(bottom=Side(style='thin'))
ws.cell(row=3, column=2).border = thin_border

wb.save("test.xlsx")
4

把所有单元格的边框设置为白色,除了那些有值的单元格。

from openpyxl import Workbook
from openpyxl.styles import Side, Border


def set_border(ws, side=None, blank=True):
    wb = ws._parent
    side = side if side else Side(border_style='thin', color='000000')
    for cell in ws._cells.values():
        cell.border = Border(top=side, bottom=side, left=side, right=side)
    if blank:
        white = Side(border_style='thin', color='FFFFFF')
        wb._borders.append(Border(top=white, bottom=white, left=white, right=white))
        wb._cell_styles[0].borderId = len(wb._borders) - 1


if __name__ == '__main__':
    from openpyxl.styles import Alignment

    wb = Workbook()
    ws = wb.active
    ws.merge_cells('A1:J2')
    ws['A1'] = 'Merge'
    ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
    ws._current_row = 2
    for i in range(1, 26):
        ws.append([i] * 10)

    side = Side(border_style='thin', color='FF0000')
    set_border(ws, side)

    wb.save('test.xlsx')
    wb.close()

在这里输入图片描述

11

在openpyxl版本2.0.4中,这段代码对我来说是有效的:

from openpyxl.styles.borders import Border, Side
from openpyxl.styles import Style
from openpyxl import Workbook

thin_border = Border(left=Side(style='thin'), 
                     right=Side(style='thin'), 
                     top=Side(style='thin'), 
                     bottom=Side(style='thin'))
my_style = Style(border=thin_border)

wb = Workbook()
ws = wb.get_active_sheet()
ws.cell(row=3, column=2).style = my_style
wb.save('border_test.xlsx')
13

这个回答适用于版本2.4.8。与之前的两个回答不同的是,边框的属性是border_style,而不是style

from openpyxl.styles.borders import Border, Side, BORDER_THIN
thin_border = Border(
    left=Side(border_style=BORDER_THIN, color='00000000'),
    right=Side(border_style=BORDER_THIN, color='00000000'),
    top=Side(border_style=BORDER_THIN, color='00000000'),
    bottom=Side(border_style=BORDER_THIN, color='00000000')
)
ws.cell(row=3, column=2).border = thin_border

关于样式的使用: https://openpyxl.readthedocs.io/en/2.5/styles.html

74

在openpyxl版本2.2.5中,这段代码对我来说是有效的:

from openpyxl.styles.borders import Border, Side
from openpyxl import Workbook

thin_border = Border(left=Side(style='thin'), 
                     right=Side(style='thin'), 
                     top=Side(style='thin'), 
                     bottom=Side(style='thin'))

wb = Workbook()
ws = wb.get_active_sheet()
# property cell.border should be used instead of cell.style.border
ws.cell(row=3, column=2).border = thin_border
wb.save('border_test.xlsx')

文档中提到样式属性还有其他的值,具体可以查看这个链接

值必须是以下几种之一:{‘double’(双线),‘dashed’(虚线),‘thin’(细线),‘medium’(中等线),‘mediumDashDot’(中等点划线),‘dashDot’(点划线),‘thick’(粗线),‘mediumDashed’(中等虚线),‘hair’(发丝线),‘dotted’(点线),‘slantDashDot’(斜点划线),‘mediumDashDotDot’(中等双点划线),‘dashDotDot’(点划点划线)}

撰写回答