Как с помощью openpyxl узнать, сколько ячеек объединено в .xlsx

У меня есть лист, где «заголовок» находится в объединенных ячейках, а значение находится в ячейках под «заголовком», см. пример.

Как я могу подсчитать, сколько ячеек занимает заголовок? Мне это нужно, чтобы знать, с чего начинать и заканчивать чтение ячеек, принадлежащих «заголовку».

+-----------+-----------+
|  Heading1 | Heading2  |
+-----------+-----------+
| 1 | 2 | 3 | 3 | 3 | 4 |
+---+---+---+---+---+---+
| 4 | 5 | 6 | 3 | 3 | 3 |
+---+---+---+---+---+---+

person The Dude    schedule 13.07.2016    source источник
comment
Имеют ли ячейки в строке заголовка какой-либо атрибут диапазона?   -  person martineau    schedule 13.07.2016
comment
Не совсем уверен, что вы подразумеваете под атрибутом span. Я думаю, что их просто вручную слили.   -  person The Dude    schedule 13.07.2016
comment
В файле Excel должно быть что-то, указывающее, что ячейка заголовка охватывает более одной ячейки строки. Распечатайте dir() объекта ячейки, который предоставляет openpyxl, и посмотрите, каковы его атрибуты.   -  person martineau    schedule 13.07.2016
comment
Как распечатать dir()? как лист.ячейка().дир() ?   -  person The Dude    schedule 13.07.2016
comment
Наверное что-то вроде dir(sheet.cell())   -  person martineau    schedule 13.07.2016
comment
Атрибута span нет. Объединенные ячейки хранятся в Excel как диапазоны A1:E2, поэтому клиентский код должен реализовать собственный расчет охвата.   -  person Charlie Clark    schedule 13.07.2016


Ответы (2)


Вы можете использовать функцию в VBA в Excel, как показано ниже.

Public Function COLUMNSINMERGED(r As Excel.Range)

If r.MergeCells Then
    COLUMNSINMERGED=r.MergeArea.Columns.Count
    Debug.Print r.MergeArea.Address, "Cols : " & r.MergeArea.Columns.Count, "Rows : " & r.MergeArea.Rows.Count
else
   COLUMNSINMERGED=r.cells.count      
End If

End Function
person Nathan_Sav    schedule 13.07.2016
comment
Вопрос конкретно об openpyxl. - person Charlie Clark; 13.07.2016
comment
Вопрос в том, как узнать, сколько ячеек объединено в .xlsx, и у вас есть тег Excel, что немного вводит в заблуждение, не упоминая python, кроме как в теге. - person Nathan_Sav; 13.07.2016

Вы можете получить функцию convertLetterToColumnNum из номер столбца Excel в текст

#calculates the span given a merged cell
#first checks to see if cell is merged and then calculates the span
def calculateSpan(sheet, cell):
    idx = cell.coordinate
    for range_ in sheet.merged_cell_ranges:
        merged_cells = list(openpyxl.utils.rows_from_range(range_))
        for row in merged_cells:
            if idx in row:
                # If this is a merged cell
                first_col=convertLetterToColumnNum(str(merged_cells[0][0][0]))
                second_col = convertLetterToColumnNum(str(merged_cells[0][1][0]))
                span=abs(second_col-first_col)+1 #remove +1 if you want to count from zero
                return span

#usage
print(calculateSpan(mysheet,mysheet['D11']))

Остальное представляет собой модифицированную версию Как мне получить значение присутствует в объединенной ячейке

person Boikem    schedule 25.01.2018