【问题标题】:Python OpenPyxl trouble detecting all merged cellsPython OpenPyxl 检测所有合并单元格时遇到问题
【发布时间】:2021-02-08 02:45:22
【问题描述】:

我正在尝试检测 openpyxl.worksheet.worksheet.Worksheet 对象中的所有合并单元格,并且似乎 merged_cells.ranges 不能所有合并单元格,但是某些列中的合并单元格。我的目标是检测合并的单元格,取消合并它们,然后根据列值重新合并某些单元格。在取消合并期间,我用合并单元格左上角的单元格值填充未合并的单元格。

我已经通过在单元格中填充 nan 来解决这个问题,这些单元格应该被识别为列中具有先前值的合并单元格,因为我的所有合并单元格都在同一列中,例如 A18:A19、B18: B19。但是在我更新了我的 xlsx 文件后,事情变得更加棘手。 OpenPyxl 在我之前的 xlsx 中没有在 A、C 和 E 列中找到合并单元格。现在它很难在 B、D 和 F 列中找到合并的单元格。两个xlsx文件格式相同但数据不同。

这是我的 xlsx 的示例: xlsx sample

我的代码读取 xlsx 然后检测并取消合并合并的单元格:

client_info_wb = load_workbook(path_client_info)
sheet_name = client_info_wb.sheetnames[0]
client_info_ws = client_info_wb[sheet_name]

for cell_group in client_info_ws.merged_cells.ranges:
    print(cell_group)
    min_col, min_row, max_col, max_row = range_boundaries(str(cell_group))
    top_left_cell_value = client_info_ws.cell(row=min_row, column=min_col).value
    print(top_left_cell_value)
    client_info_ws.unmerge_cells(str(cell_group))
    for row in client_info_ws.iter_rows(min_col=min_col, min_row=min_row, max_col=max_col, max_row=max_row):
        for cell in row:
            cell.value = top_left_cell_value

print(cell_group) 的输出:

A48:A49
2021-01-05
C48:C49
XX5614
E48:E49
ID
A46:A47
2021-01-05
C46:C47
XX2134
E46:E47
ID
A44:A45
2021-01-05
C44:C45
XX1234
E44:E45
ID

在我的代码中进行以下操作时,openpyxl merge_cells.ranges 无法检测到合并单元格的那些列中的信息是必要的。那么有人可以帮我解决这个问题吗?有没有人有同样的问题?我花了很长时间试图在我的 xlsx 中查找模式以找出导致问题的原因,但没有运气。

【问题讨论】:

    标签: python excel openpyxl


    【解决方案1】:
        while sheet.merged_cells: # <- Here's the change to make.
            for cell_group in sheet.merged_cells:
                val = str(cell_group.start_cell.value).strip()
                sheet.unmerge_cells(str(cell_group))
                for merged_cell in cell_group.cells:
                    sheet.cell(row=merged_cell[0], column=merged_cell[1]).value = val
    

    似乎merged_cells 的集合在迭代时会发生变化,因此重复循环直到merged_cellsNone 就可以了。

    内存缓冲区也发生了一些奇怪的事情,所以我将文件保存到磁盘并用 pandas 重新加载,而不是从内存中的工作表加载数据帧。 (这可以很容易地使用 BytesIO 对象进行优化。)

    对我来说,这保证了所有合并的单元格都未合并并替换为起始单元格的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多