如何使用openpyxl检测excel中的合并单元格

时间:2016-09-19 13:55:55

标签: python excel merge

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

我想了解每个单元格是否合并以及合并了多少单元格,但我找不到任何这样做的函数。 工作表中有其他单元格,所以我无法使用它。

感谢任何帮助,我更喜​​欢openpyxl模块,但其他模块也可以使用。

谢谢大家!

4 个答案:

答案 0 :(得分:16)

您可以在工作表上使用merged_cells.ranges(版本2.5.0-b1 (2017-10-19)中已弃用merged_cell_ranges,更改为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)

答案 1 :(得分:2)

要测试是否合并了一个单元格,可以检查类(名称):

cell = sheet.cell(row=15, column=14)
if type(cell).__name__ == '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))

答案 2 :(得分:1)

要测试是否合并了一个单元格,我像@A一样遍历sheet.merged_cells.ranges。刘建议。 不幸的是,检查像@ 0x4a6f4672所示的单元格类型不再起作用。

这是一个向您展示如何执行此功能的功能。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

class ColorPicker(QColorDialog):
    def __init__(self):
        super().__init__()

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.color = None
        self.colorpicker = ColorPicker()
        self.colorChooser = QPushButton("ColorChooser", self)
        self.colorChooser.clicked.connect(self.onColorPicker)
        self.colorChooser.move(10, 10)

    def onColorPicker(self):
        self.get_color = self.colorpicker.getColor()
        self.setStyleSheet("background-color:%s;" % self.get_color.name())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.setFixedSize(400, 400)
    mw.show()
    sys.exit(app.exec_())

答案 3 :(得分:1)

所有这些都帮助了(谢谢),但是当我将方法与几个电子表格一起使用时,并没有分解我期望的所有单元格。我不得不循环并为合并而休息,以最终使它们全部完成。在我的情况下,需要四次通过才能使所有内容按预期进行合并:

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