Python - найти ссылку на ячейку в коллекции merged_cells в openpyxl - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу определить, найдена ли ячейка на листе в коллекции merged_cells, возвращенной openpyxl.

Диапазон merged_cells выглядит следующим образом (отладчик VSCode):

enter image description here

У меня есть ссылка на ячейку J31, которая находится в этой коллекции.Как написать функцию, которая возвращает true, если эта ячейка найдена в коллекции merged_cells.ranges?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

В дополнение к ответу Д.Банаха (+1), попробуйте что-то вроде этого (основываясь на предыдущем примере, который я написал для кого-то другого, поскольку у вашего вопроса мало контекста) :

for cell in ws.merged_cells.ranges:
    #print(cellRef +' ==> '+ str(cell.min_row) +'/'+ str(cell.max_row) +'/'+ str(cell.min_col) +'/'+ str(cell.max_col))
    if (int(cell.min_row) <= int(row) <= int(cell.max_row)) and (int(cell.min_col) <= int(col) <= int(cell.max_col)):
        print('Cell ' +cellRef+ ' is a merged cell')

Пример в контексте:

import re

cellBorders = fnGetCellBorders(ws, cellRef)
if ('T' in cellBorders) or  ('L' in cellBorders) or  ('R' in cellBorders) or  ('B' in cellBorders) or  ('M' in cellBorders):
    print('Cell has border *OR* is a merged cell and borders cannot be checked')

def getCellBorders(ws, cellRef):
    tmp = ws[cellRef].border
    brdrs = ''

    if tmp.top.style is not None: brdrs += 'T'
    if tmp.left.style is not None: brdrs += 'L'
    if tmp.right.style is not None: brdrs += 'R'
    if tmp.bottom.style is not None: brdrs += 'B'

    if (brdrs == '') and ('condTableTopLeftCell' in refs):
        if fnIsCellWithinMergedRange(ws, cellRef): brdrs = 'M'
    return brdrs

def fnIsCellWithinMergedRange(ws, cellRef):
    ans = False
    col = fnAlphaToNum(re.sub('[^A-Z]', '', cellRef))
    row = re.sub('[^0-9]', '', cellRef)
    for cell in ws.merged_cells.ranges:
        if (int(cell.min_row) <= int(row) <= int(cell.max_row)) and (int(cell.min_col) <= int(col) <= int(cell.max_col)):
            ans = True
    return ans

def fnAlphaToNum(ltr):
    ab = ["MT", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    return ab.index(ltr)

Ссылки:

OpenPyXL - Как запросить границы ячеек?

Как обнаружить объединенные ячейки в Excel с openpyxl

https://bitbucket.org/openpyxl/openpyxl/issues/911/borders-on-merged-cells-are-not-preserved

0 голосов
/ 25 сентября 2018
for cell in ^^merged_range^^:
    if cell==your_special_cell:
         return True

^^ merged_range ^^ должен иметь тип openpyxl.worksheet.cell_range

...