使用openpyx将边框应用于范围内的所有单元格

2024-04-28 08:42:49 发布

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

我有一个脚本,它接受一个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

此功能是否存在?如果没有,请有人至少解释一下如何应用默认边框样式,而不是这个稍厚的边框?Border.Borderúu厚实、Border.Borderúu中等、Border.Border戋薄或Border.Border戋毛发似乎都不正确。

谢谢!


Tags: wsstylecellrangeexcelfnamethin边框
3条回答

@user698585您的方法看起来不错,但随着当前版本的openpyxl改变了实现,它不再工作。所以这个应该更新成

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

但这会导致一个错误,即不允许更改样式。 作为一个解决方法,我刚刚定义了一个专用样式,但它们只是当前样式和边框定义的一个复制品-不是很好的解决方案,因为只有当您知道什么样式下的单元格发生了更改时才有效。

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

也许这很方便:

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

它的表现相当快。

在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.iter_rows(cell_range)
    for row in rows:
        for cell in row:
            cell.border = border

set_border(worksheet, 'A5:C10')

相关问题 更多 >