如何检测Excel工作表中的合并单元格?

问题描述 投票:0回答:6

我正在尝试从包含合并单元格的 Excel 工作表中读取数据。 当使用 openpyxl 读取合并单元格时,第一个合并单元格包含该值,其余单元格为空。

我想知道每个单元格是否被合并以及有多少个单元格被合并,但我找不到任何这样做的函数。 该工作表有空的其他单元格,所以我不能使用它。

python excel openpyxl
6个回答
30
投票

您可以在工作表上使用

merged_cells.ranges
merged_cell_ranges
已在版本2.5.0-b1(2017-10-19)中已弃用,更改为merged_cells.ranges)(似乎找不到每个行)像这样:

from openpyxl import load_workbook
wb = load_workbook(filename='a file name')
sheet_ranges = wb['Sheet1']

print(sheet_ranges.merged_cells.ranges)

10
投票

要测试单个单元格是否合并,您可以检查类型:

cell = sheet.cell(row=15, column=14)
if isinstance(cell, MergedCell):
  print("Oh no, the cell is merged!")
else:
  print("This cell is not merged.")

要“取消合并”所有单元格,您可以使用该功能

unmerge_cells

for items in sorted(sheet.merged_cell_ranges):
  print(items)
  sheet.unmerge_cells(str(items))

7
投票

为了测试单个单元格是否被合并,我像@A一样循环访问sheet.merged_cells.ranges。刘建议。 不幸的是,检查 @0x4a6f4672 等单元格类型显示不再起作用。

这里有一个函数向您展示如何执行此操作。

def testMerge(row, column):
    cell = sheet.cell(row, column)
    for mergedCell in sheet.merged_cells.ranges:
        if (cell.coordinate in mergedCell):
            return True
    return False

5
投票

问题询问如何检测合并的单元格并读取它们,但到目前为止提供的答案仅涉及检测取消合并。这是一个返回单元格的逻辑值的函数,用户将看到包含在合并单元格中的值:

import sys
from openpyxl import load_workbook
from openpyxl.cell.cell import MergedCell


def cell_value(sheet, coord):
  cell = sheet[coord]
  if not isinstance(cell, MergedCell):
    return cell.value

  # "Oh no, the cell is merged!"
  for range in sheet.merged_cells.ranges:
    if coord in range:
      return range.start_cell.value

  raise AssertionError('Merged cell is not in any merge range!')


workbook = load_workbook(sys.argv[1])
print(cell_value(workbook.active, sys.argv[2]))

1
投票

这些都有帮助(谢谢),但是当我在几个电子表格中使用这些方法时,它并没有取消合并我期望的所有单元格。我必须循环并重新测试合并才能最终完成所有操作。就我而言,需要 4 遍才能让所有内容按预期取消合并:

    mergedRanges = sheet_ranges.merged_cells.ranges
    ### How many times do we run unmerge?
    i=0
    ### keep testing and removing ranges until they are all actually gone
    while mergedRanges:
        for entry in mergedRanges:
            i+=1
            print("  unMerging: " + str(i) + ": " +str(entry))
            ws.unmerge_cells(str(entry))

0
投票

如果逐行解析,另一种方法会很有用

import openpyxl
wb=load_workbook('workbook.xlsx')
sheet=wb['yousheet']
def isMerged(cell):
   return type(cell) == openpyxl.cell.cell.MergedCell

isMerged(sheet['A1'])#True or False
© www.soinside.com 2019 - 2024. All rights reserved.