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_cells
feature, 하지만 만약 위의 코드가 당신의 요구에 불충분하고 당신이 내가 했던 것과 같은 오류를 마주친다면 당신은 그렇게 하는 것에 흥미를 느낄지도 모릅니다.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
'programing' 카테고리의 다른 글
C/C++에서 OpenGL 셰이더를 위한 손쉬운 프레임워크 (0) | 2023.11.07 |
---|---|
PHP oci_connect() TNS: 연결 식별자(ORA-12154)를 확인할 수 없습니다. (0) | 2023.11.07 |
그래들을 통해 지프스터 프로젝트를 만들고 있는데, 첫 번째 프로젝트는 잘 실행되지만 두 번째 프로젝트는 예외가 있습니까? (0) | 2023.11.07 |
비주얼 스튜디오 코드로 Debug & Run Angular2 타입스크립트? (0) | 2023.11.07 |
.NET에서 오라클 연결을 닫는 방법 (0) | 2023.11.07 |