在openpyxl中格式化Excel文件

2024-04-28 08:38:36 发布

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

在我的项目中,我创建了.xlsx文件,并使用ws.append([list])用数据填充它。就像这样:

for line in inf:
    current_line = line.strip().split(';')
    ws.append(current_line)

标题行也是使用.append()方法添加的

我需要做的下一件事是为标题行应用一种样式(粗体字体),为整个表格应用另一种样式(每个单元格应该有简单的边框)

我尝试过不同的方法(主要是在openpyxl.readthedocs.io和Googled上),但没有一种对我有效

是否有方法为第一行应用样式,并为文件中的所有现有单元格应用边框?困难在于我在每一行中有不同数量的列,而行的数量未知(很多)。边框应相应地应用于最长行的宽度,如图中所示

enter image description here

我尝试过的一些方法:

col = ws.column_dimensions['A']
col.border =  = Border(left=Side(border_style='thin', color='FF000000'),
             right=Side(border_style='thin', color='FF000000'),
             top=Side(border_style='thin', color='FF000000'),
             bottom=Side(border_style='thin', color='FF000000')
    )

row = ws.row_dimensions[1]
row.border =  = Border(left=Side(border_style='thin', color='FF000000'),
             right=Side(border_style='thin', color='FF000000'),
             top=Side(border_style='thin', color='FF000000'),
             bottom=Side(border_style='thin', color='FF000000')
    )

这些甚至不适用于单个行/列(1/'a')

UPD: 试过这个

row = 1
for line in inf:
    curr_line = line.strip().split(';')
    n_cols = len(curr_line)
    ws.append(curr_line)
    for col in range(1, n_cols + 1):
        cell = ws.cell(row, col)
        cell.border = cell_border
        if row == 1:        # Header Style
            cell.font = Font(bold=True)
    row += 1

结果呢。边界分布在某种程度上并不均匀。有些行很短,有些行很长,看起来并不令人满意。除此之外,有些细胞没有边界或根本没有边界。 enter image description here


Tags: 方法inforwsstylelinecellcol
1条回答
网友
1楼 · 发布于 2024-04-28 08:38:36

我假设您正在尝试将单元格样式应用于“列表”类型,而不是“openpyxl.Cell.Cell.Cell”类型

下面是在假设条件下使用openpyxl添加样式的代码段:

  • 当前行:某物的列表。
  • 标题仅为第1行。
  • 版本:Python 3.8.1
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, Font

wb = load_workbook(filename="sample.xlsx", read_only=False)
ws = wb.active

data = [["H1", "H2", "H3", "H4", "H5", "H6"],[1,2,3,4,5,6,7],[11,12,13],[21,22,23,24,25,26,27],[31,32],[41,42,43,44,45],[51,52]]

cell_border = Border(left=Side(border_style='thin', color='FF000000'),
                     right=Side(border_style='thin', color='FF000000'),
                     top=Side(border_style='thin', color='FF000000'),
                     bottom=Side(border_style='thin', color='FF000000')
)

n_rows = len(data)
for row in range(1, n_rows + 1):
    n_cols = len(data[row-1])
    ws.append(data[row-1])
    for col in range(1, n_cols + 1):
        cell = ws.cell(row, col)
        cell.border = cell_border
        if row == 1:        # Header Style
            cell.font = Font(bold=True)
wb.save("sample.xlsx")

您可以修改以满足您的确切要求。 希望能有帮助

更新:

max_rows = 0
max_cols = 0

for line in inf:
    current_line = line.strip().split(';')
    ws.append(current_line)
    max_rows += 1
    row_size = len(current_line)
    if row_size > max_cols:
        max_cols = row_size

for row in range(1, max_rows + 1):
    for col in range(1, max_cols + 1):
        cell = ws.cell(row, col)
        cell.border = cell_border
        if row == 1:        # Header Style
            cell.font = Font(bold=True)

有关openpyxl单元格格式here的更多详细信息

相关问题 更多 >