programing

Python으로 Excel에서 병합된 셀 읽기

muds 2023. 11. 7. 21:09
반응형

Python으로 Excel에서 병합된 셀 읽기

xlrd를 이용하여 python으로 엑셀의 merged cell을 읽으려고 합니다.

My Excel: (첫번째 열은 세 행에 걸쳐 병합됨)

    A   B   C
  +---+---+----+
1 | 2 | 0 | 30 |
  +   +---+----+
2 |   | 1 | 20 |
  +   +---+----+
3 |   | 5 | 52 |
  +---+---+----+

이 예제에서 첫번째 열의 세번째 줄을 2와 같게 읽고 싶지만 다시 돌아옵니다.''. 병합된 셀의 가치에 도달하는 방법을 알고 계십니까?

내 코드:

all_data = [[]]
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab

for row_index in range(sheet_0.nrows):
    row= ""
    for col_index in range(sheet_0.ncols):
        value = sheet_0.cell(rowx=row_index,colx=col_index).value             
        row += "{0} ".format(value)
        split_row = row.split()   
    all_data.append(split_row)

얻는 정보:

'2', '0', '30'
'1', '20'
'5', '52'

받고 싶은 것:

'2', '0', '30'
'2', '1', '20'
'2', '5', '52'

방금 시도해봤는데 샘플 데이터에 효과가 있는 것 같습니다.

all_data = []
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab

prev_row = [None for i in range(sheet_0.ncols)]
for row_index in range(sheet_0.nrows):
    row= []
    for col_index in range(sheet_0.ncols):
        value = sheet_0.cell(rowx=row_index,colx=col_index).value
        if len(value) == 0:
            value = prev_row[col_index]
        row.append(value)
    prev_row = row
    all_data.append(row)

돌아오는

[['2', '0', '30'], ['2', '1', '20'], ['2', '5', '52']]

이전 행의 값을 추적하고 현재 행의 해당 값이 비어 있으면 이 값을 사용합니다.

위 코드는 주어진 셀이 실제로 병합된 셀 집합의 일부인지 여부를 확인하지 않으므로 셀이 실제로 비어 있어야 할 경우 이전 값을 복제할 수 있습니다.그래도 도움이 될지도 모르겠네요.

추가 정보:

그 후 병합된 셀의 다양한 범위에 포함된 셀을 결정하는 데 사용할 수 있는 속성에 대해 설명하는 문서 페이지를 찾았습니다.설명서에는 "버전 0.6.1의 새 버전"이라고 되어 있는데, xlrd-0.9.3과 함께 사용하려고 했을 때 설치된 것으로 되어 있었습니다.pip오류가 났습니다.

구현되지 않음 오류: formating_info=True가 아직 구현되지 않았습니다.

저는 특별히 다른 버전의 xlrd를 추적해서 테스트할 생각은 없습니다.merged_cellsfeature, 하지만 만약 위의 코드가 당신의 요구에 불충분하고 당신이 내가 했던 것과 같은 오류를 마주친다면 당신은 그렇게 하는 것에 흥미를 느낄지도 모릅니다.formatting_info=True.

팬더 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html 에서 사용할 수 있는 필나 방법을 사용해 볼 수도 있습니다.

df = pd.read_excel(dir+filename,header=1)
df[ColName] = df[ColName].fillna(method='ffill')

셀의 값을 이전 값으로 대체해야 합니다.

병합된 셀을 처리하려는 사람들을 위해, OP가 요청한 방식이지만 병합되지 않은 빈 셀을 덮어쓰지는 않습니다.

OP의 코드와 @gordthompson의 답변과 @stavinsky의 코멘트를 바탕으로 다음 코드는 엑셀파일(xls, xlsx)에 적용될 것이며, 엑셀파일의 첫번째 시트를 데이터 프레임으로 읽을 것입니다.원래 포스터에서 요청한 대로 병합된 이 셀이 나타내는 모든 셀에 병합된 셀 내용이 복제됩니다.'xls' 파일에 대한 xlrd의 merged_cell 기능은 워크북을 여는 동안 'formating_info' 매개 변수가 전달된 경우에만 작동합니다.

import pandas as pd
filepath = excel_dir+ excel_file
if excel_file.endswith('xlsx'):
    excel = pd.ExcelFile(xlrd.open_workbook(filepath), engine='xlrd')
elif excel_file.endswith('xls'):
    excel = pd.ExcelFile(xlrd.open_workbook(filepath, formatting_info=True), engine='xlrd')
else:
    print("don't yet know how to handle other excel file formats")
sheet_0 = excel.sheet_by_index(0) # Open the first tab
df = xls.parse(0, header=None) #read the first tab as a datframe

for e in sheet_0.merged_cells:
    rl,rh,cl,ch = e
    print e
    base_value = sheet1.cell_value(rl, cl)
    print base_value
    df.iloc[rl:rh,cl:ch] = base_value

XLRD 병합 셀 사용

ExcelFile = pd.read_excel("Excel_File.xlsx")
xl = xlrd.open_workbook("Excel_File.xlsx")
FirstSheet = xl.sheet_by_index(0)
for crange in FirstSheet.merged_cells:
    rlo, rhi,clo, chi = crange
    for rowx in range(rlo,rhi):
        for colx in range(clo,chi):
            value = FirstSheet.cell(rowx,colx).value
        if len(value) == 0:
            ExcelFile.iloc[rowx-1,colx] = FirstSheet.cell(rlo,clo).value

xlwings 사용

병합 셀의 결과를 알려주는 함수를 작성하였습니다.거래하는 셀과 시트 이름을 제공해야 합니다.

그래서 우선 시트의 이름을 다음과 같이 알려주셔야 합니다.

# Import libraries like VBA
import xlwings as xw
# Read content of workbook
wb = xw.Book(Your_file with xlsx)
# Read first Sheet of workbook
Sheet1=wb.sheets[0]

그런 다음 다음 기능을 넘깁니다.

def VMC(Sheet1, x):
    # Get index of a cell 
    row=Sheet1[x].row
    column=Sheet1[x].column
    # Get first non-empty row
    if Sheet1[x].merge_cells:
        i=1
        while Sheet1[row-i,column-1:column].merge_cells:
            i+=1
        t=Sheet1[row-i+1,column-1:column].value
    else:
        t=Sheet1[row-i+1,column-1:column].value
    return t

그러면 그렇게 예를 들 수 있습니다.

a=VMC(Sheet1, 'D'+str(row_index_first))
a

결과가 병합된 셀 자체입니다.많은 셀을 루프오버하고 병합 셀 목록을 작성한 다음 필요한 행과 결합할 때 이 기능을 사용할 수 있습니다.

아니면 굳이 제 기능을 사용할 필요는 없지만, 그 기능에 영감을 얻어 자신의 경우에 편리한 것을 작성할 수 있습니다.

저는 기존 솔루션을 사용하지 않고 이전 솔루션을 사용해 보았지만 다음과 같은 작업이 가능했습니다.

sheet = book.sheet_by_index(0)
all_data = []

for row_index in range(sheet.nrows):
    row = []
    for col_index in range(sheet.ncols):
        valor = sheet.cell(row_index,col_index).value
        if valor == '':
            for crange in sheet.merged_cells:
                rlo, rhi, clo, chi = crange
                if rlo <= row_index and row_index < rhi and clo <= col_index and col_index < chi:
                    valor = sheet.cell(rlo, clo).value
                    break
        row.append(valor)
    all_data.append(row)

print(all_data)

앞으로 누군가에게 도움이 되었으면 좋겠습니다.

openpyxl.worksheet.merged_cell_ranges

이 기능을 사용하면 다음과 같은 배열을 얻을 수 있습니다.['A1:M1', 'B22:B27'], 합병될 세포를 알려주는군요

openpyxl.worksheet.merged_cells

이 함수는 셀이 병합되었는지 여부를 보여줍니다.

언급URL : https://stackoverflow.com/questions/30727017/read-merged-cells-in-excel-with-python

반응형