source

Excel 시트에서 병합된 셀을 탐지하는 방법은 무엇입니까?

factcode 2023. 7. 3. 23:22
반응형

Excel 시트에서 병합된 셀을 탐지하는 방법은 무엇입니까?

병합된 셀이 포함된 Excel 시트에서 데이터를 읽으려고 합니다.openpyxl을 사용하여 병합된 셀을 읽을 때 첫 번째 병합된 셀에는 값이 포함되고 나머지 셀은 비어 있습니다.

각 셀의 병합 여부와 병합되는 셀의 개수를 알고 싶은데 해당 기능을 찾을 수 없었습니다.시트에 다른 셀이 비어서 사용할 수 없습니다.

사용할 수 있습니다.merged_cells.ranges(merged_cell_ranges버전 2.5.0-b1(2017-10-19)에서 더 이상 사용되지 않으며, 시트에서 merged_cells.dll로 변경되었습니다(행당 찾을 수 없음).

from openpyxl import load_workbook
wb = load_workbook(filename='a file name')
sheet_ranges = wb['Sheet1']

print(sheet_ranges.merged_cells.ranges)

단일 셀의 병합 여부를 테스트하려면 클래스(이름)를 확인합니다.

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

단일 셀이 병합되는지 테스트하기 위해 @A와 같이 sheet.merged_cells.range를 반복합니다.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))

언급URL : https://stackoverflow.com/questions/39574991/how-to-detect-merged-cells-in-an-excel-sheet

반응형