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

nmpmafwu  于 2023-06-25  发布在  其他
关注(0)|答案(5)|浏览(234)

我正在尝试从包含合并单元格的Excel工作表中读取数据。使用openpyxl阅读合并单元格时,第一个合并单元格包含值,其余单元格为空。
我想知道每个单元格是否被合并,以及有多少单元格被合并,但我找不到任何这样做的函数。工作表中有空的单元格,所以我不能使用它。

wh6knrhe

wh6knrhe1#

您可以在工作表中使用merged_cells.rangesmerged_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)
oymdgrw7

oymdgrw72#

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

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))
kcugc4gi

kcugc4gi3#

为了测试单个单元格是否被合并,我循环查看sheet.merged_cells.ranges,比如@A刘建议。不幸的是,检查像@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
t1qtbnec

t1qtbnec4#

这个问题询问了检测合并的单元格和 * 阅读 * 它们,但到目前为止,提供的答案只涉及 * 检测 * 和 * 取消合并 *。这里有一个函数,它返回单元格的 logical 值,用户将看到包含在合并单元格中的值:

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]))
h79rfbju

h79rfbju5#

这些都有帮助(谢谢),但是当我在几个电子表格中使用这些方法时,它并没有合并我期望的所有单元格。我不得不循环并重新测试合并,以最终完成它们。在我的例子中,我们花了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))

相关问题