Как установить границы в Excel до определенного столбца - PullRequest
0 голосов
/ 28 июня 2019

Я пишу фрейм данных, чтобы преуспеть, и пытаюсь добавить границы. На данный момент я выяснил, как добавить границы на лист, используя

bold = workbook.add_format({'bold': True, 'border': True})
worksheet.set_row(1, cell_format=bold)

но это расширяет границу за последним столбцом информационного кадра. Есть ли способ остановить границы в последнем столбце моего фрейма данных?

Спасибо

1 Ответ

1 голос
/ 28 июня 2019

Я не уверен, что это тот, который вы используете, но это можно сделать с помощью пакета openpyxl.

Сначала мы можем создать тестовый фрейм данных:

import openpyxl
from openpyxl.styles import Border, Side
from openpyxl.utils.dataframe import dataframe_to_rows
import pandas

headers = ["column1", "column2", "column3"]
records = [{k: 0 for k in headers} for _ in range(25)]
df = pandas.DataFrame.from_records(records)

Теперь мы создаем объект рабочей книги и помещаем в него фрейм данных:

wb = openpyxl.Workbook()
ws = wb.active
for row in dataframe_to_rows(df, index=False, header=True):
    ws.append(row)

Далее я определяю тонкую границу, которая будет использоваться вокруг всего набора данных

thin_border = Side(border_style="thin", color='FF000000')

Теперь я создаюграницы, необходимые для каждой отдельной ячейки.Вы не указали, как вы хотели бы граничить с данными, поэтому я принял границы вокруг всего кадра.Так как мы знаем количество столбцов и строк, мы можем перебирать ячейки и строить параметры для конструктора Border, которые подходят для каждой ячейки на листе.

for i in range(1, len(df) + 2):  # Excel indexes at 1 and header row is extra
    for j in range(1, len(headers) + 1):
        sides = {"top": Side(), "bottom": Side(), "left": Side(), "right": Side()}
        if j == 1:  # Left Most Column:
            sides["left"] = thin_border

        if i == 1:  # Top Row
            sides["top"] = thin_border

        if j == len(headers):  # Right Most Column
            sides["right"] = thin_border

        if i == len(df) + 1:  # Bottom Row
            sides["bottom"] = thin_border

        ws.cell(i, j).border = Border(**sides)  # Apply sides to current cell

wb.save("output.xlsx")

Обратите внимание, что мне пришлось использоватьBorder(**sides), поскольку объекты Side являются неизменными в пакете.Я не уверен, есть ли более эффективный способ сделать это, так как у меня нет большого опыта работы с пакетом, но это делается.

Отсюда должно быть просто применить границыоднако вы считаете нужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...