web-dev-qa-db-ja.com

Python

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'
11
Antoine

私はこれを試したところ、あなたのサンプルデータでうまくいくようです:

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でした。

13
Gord Thompson

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

これにより、セルの値が以前の値に置き換えられます

4
pprasad009

結合されたセルの処理を探している人のために、結合されていない空のセルを上書きせずに、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
1
Alok Nayak

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
0
Praful

私は存在することなく以前の解決策を試していましたが、それでも以下がうまくいきました:

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)

私はそれが将来誰かに役立つことを願っています

0
Manuel Temple