Форматирование файлов Excel в openpyxl - PullRequest
1 голос
/ 04 марта 2020

В моем проекте я создаю файл .xlsx и заполняю его данными, используя ws.append ([список]). Например:

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

Строка заголовка также добавляется с помощью метода .append ().

Следующее, что мне нужно сделать, это применить один стиль для строки заголовка (жирный шрифт) и другой стиль для всей таблицы (каждая ячейка должна иметь простые границы).

Я пробовал разные методы для этого (в первую очередь на openpyxl.readthedocs.io и Googled), но ни один из них не работал для меня.

Есть ли способ применить стиль для первой строки и применить границы для всех существующих ячеек в файле? Сложность в том, что у меня разное количество столбцов в каждой строке и неизвестное количество строк (их много). Границы должны применяться в соответствии с шириной самой длинной строки, как в pi c.

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

1 Ответ

1 голос
/ 04 марта 2020

Я предполагаю, что вы пытаетесь применить стиль ячейки к типу ' list ', а не к типу ' openpyxl.cell.cell.Cell '.

Ниже приведен фрагмент добавления стилей с использованием openpyxl в предположениях:

  • current_line: список чего-либо.
  • Заголовок Только строка 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 форматировании ячеек здесь .

...