Python xlrdを使用してExcelの結合セルを読み取ろうとしています。
My Excel:(最初の列が3つの行にマージされていることに注意してください)
A B C
+---+---+----+
1 | 2 | 0 | 30 |
+ +---+----+
2 | | 1 | 20 |
+ +---+----+
3 | | 5 | 52 |
+---+---+----+
この例では、最初の列の3行目を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']]
前の行の値を追跡し、現在の行の対応する値が空の場合はそれらを使用します。
上記のコードは、特定のセルが実際にマージされたセルのセットの一部であるかどうかをチェックしないため、セルが実際に空である必要がある場合に、以前の値を複製する可能性があることに注意してください。それでも、それはいくつかの助けになるかもしれません。
追加情報:
その後、マージされたセルのさまざまな範囲に含まれるセルを特定するために使用できる merged_cells
属性について説明しているドキュメントページを見つけました。ドキュメントには「バージョン0.6.1の新機能」と記載されていますが、pip
によってインストールされたxlrd-0.9.3で使用しようとすると、エラーが発生しました
NotImplementedError:formating_info = Trueはまだ実装されていません
私は特にmerged_cells
機能をテストするためにxlrdの異なるバージョンを追跡し始める傾向はありませんが、上記のコードではニーズが不十分で、同じエラーが発生する場合は、そうすることに興味があるかもしれません。 formatting_info=True
でした。
pandas= https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html で利用可能なfillnaメソッドを使用して試すこともできます=
df = pd.read_Excel(dir+filename,header=1)
df[ColName] = df[ColName].fillna(method='ffill')
これにより、セルの値が以前の値に置き換えられます
結合されたセルの処理を探している人のために、結合されていない空のセルを上書きせずに、OPが求めた方法。
OPのコードと@gordthompsonの回答と@stavinskyのコメントによって提供される追加情報に基づいて、次のコードはExcelファイル(xls、xlsx)で機能し、Excelファイルの最初のシートをデータフレームとして読み取ります。結合されたセルごとに、元の投稿者からの質問に応じて、結合されたセルの内容がこの結合されたセルが表すすべてのセルに複製されます。「xls」ファイルのxlrdのmerged_cell機能は、「formatting_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
私は存在することなく以前の解決策を試していましたが、それでも以下がうまくいきました:
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)
私はそれが将来誰かに役立つことを願っています