我尝试从一个包含合并单元格的Excel表中读取数据。使用openpyxl读取合并单元格时,第一个合并单元格包含值,其余单元格为空。
我想知道每个单元格是否已合并以及合并了多少个单元格,但我找不到任何能够实现此功能的函数。该表还有其他空单元格,因此我无法使用这些信息。
您可以在工作表上使用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)
ranges
返回一个 MergeCell
对象列表。每个对象都有一个 bounds
属性,该属性返回合并单元格的 4 个角落的元组,格式为 (col_low, row_low, col_high, row_high)
。 - Tomerikoo要测试单个单元格是否合并,可以检查类型:
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))
为了测试单元格是否合并,我遍历了sheet.merged_cells.ranges,就像@A. Lau建议的那样。不幸的是,像@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
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]))
这些都有帮助(谢谢),但当我在几个电子表格中使用这些方法时,它没有像我预期的那样取消合并所有单元格。我不得不循环和重新测试合并才最终让它们全部完成。在我的情况下,需要进行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))
load_workbook(..., read_only=True)
,因为合并单元格的信息在只读模式下不可用。 - undefined