2017-01-09 4 views
2

Я пытаюсь создать таблицу для табуляции данных с помощью пакета сторонних разработчиков python, openpyxl. Первый оператор инструкции рисует строку строки из ячейки 'A5' в ячейку 'E5', Второй оператор for рисует другую строку строки из ячейки 'A6' в ячейку 'E6' Третий оператор оператора рисует столбец строка из ячейки 'C5' в ячейку 'C9' Четвертая инструкция оператора рисует другой столбец из ячейки 'F5 в ячейку' F9 'Openpyxl Пограничная линия разрывается на пересечении с другой пограничной линией

Однако граница столбца, взятая из ячейки' C5 'в' C9 ', кажется, нарушается только , когда он пересекает строки строк из ячейки 'A5 в' E5 'и' A6 'в' E6 ', а начинает рисовать на' C7 'вместо' C5 '.

В то время как граница границы столбца, взятая из ячейки 'F5': 'F9', работала отлично. (я бы разместил изображение создаваемой таблицы, но у меня репутация менее 10) Есть ли что-нибудь, что я делаю неправильно?

from openpyxl import Workbook 
from openpyxl.styles import Border, Side 
wb = Workbook() 
ws = wb.active 
ws.sheet_view.showGridLines = False 

column_border = Border(left=Side(style='thin')) 
row_border = Border(top=Side(style='thin')) 

for col in ws['C5:C9']: 
    for cell in col: 
     cell.border = column_border 
for col in ws['F5:F9']: 
    for cell in col: 
     cell.border = column_border 

for row in ws['A5:E5']: 
    for cell in row: 
     cell.border = row_border 
for col in ws['A6:E6']: 
    for cell in col: 
     cell.border = row_border 

wb.save('a.xlsx') 

ответ

1

Проблема в том, что вы переписываете объект Border этих ячеек, где они пересекаются. Ваши первые две петли задают объект Border клеток как тонкую линию на левой стороне. Следующие две петли устанавливают объект Border Object в качестве тонкой линии сверху - но это избавляет от исходного объекта Border, который создал верхнюю строку.

Что я бы рекомендовал делать, это создать два метода, которые добавят объект границы. Методы проверят, существует ли граница. Если это произойдет, это увеличит его, а не заменит. Затем вы вызываете эти методы в своих циклах, а не прямое назначение.

Этот код может работать или не работать, моя текущая система не имеет установленного OpenPyXL, и мне нужны права администратора для ее установки.

def add_row_boarder(row_cell): 
    if row_cell.border = None: 
     row_cell.border = row_border 
    else: 
     row_cell.border.top = Side(style='thin') 
    return row_cell 

def add_col_boarder(col_cell): 
    if col_cell.border = None: 
     col_cell.border = col_border 
    else: 
     col_cell.border.left = Side(style='thin') 
    return col_cel 
+0

Спасибо. Первое утверждение дало мне представление о проблеме, я действительно переписывал пересекающиеся границы. – Qudus

1

Как отмечает Роб, вы переписываете границы некоторых ячеек. Общий подход к форматированию диапазона ячеек предоставляется documentation, но в основном вы можете просто комбинировать стили, поэтому cell.border = cell.border + row_border

+0

Сочетание стилей работало хорошо. благодаря – Qudus