簡體   English   中英

Python OpenPyxl 檢測所有合並單元格時遇到問題

[英]Python OpenPyxl trouble detecting all merged cells

我正在嘗試檢測openpyxl.worksheet.worksheet.Worksheet object 中的所有合並單元格,並且似乎merge_cells.ranges不能所有合並單元格,而是某些列中的合並單元格。 我的目標是檢測合並的單元格,取消合並它們,然后根據列值重新合並某些單元格。 在取消合並期間,我用合並單元格的左上角單元格值填充未合並的單元格。

我已經通過在單元格中填充 nan 來解決這個問題,這些單元格應該被識別為列中具有先前值的合並單元格,因為我的所有合並單元格都在同一列中,例如 A18:A19、B18:B19。 但是在我更新了我的 xlsx 文件后,事情變得更加棘手。 OpenPyxl 沒有在我之前的 xlsx 中的 A、C 和 E 列中找到合並單元格。 現在它很難在 B、D 和 F 列中找到合並的單元格。 兩個 xlsx 文件具有相同的格式但不同的數據。

這是我的 xlsx 的示例: xlsx 示例

我讀取 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

Output 用於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 中找到模式,以找出導致問題的原因,但沒有運氣。

    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

似乎 merge_cells 的集合在迭代時會發生變化,因此重復循環直到merged_cellsNone就可以了。

內存緩沖區也發生了一些奇怪的事情,所以我將文件保存到磁盤並使用 pandas 重新加載它,而不是從 ZCD69B4957F06CD818D7BF3D61980E 的工作表中加載 dataframe。 (這可以使用 BytesIO object 輕松優化。)

對我來說,這保證了所有合並的單元格都未合並並替換為起始單元格的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM