web-dev-qa-db-ja.com

openpyxlで行の値を表示する

Pythonのcsvモジュールには、csv.readerという関数があり、これを使用して行を反復し、リーダーオブジェクトを返し、リストのようにコンテナーに保持できます。

したがって、リストが変数に割り当てられて印刷されると、次のようになります。

csv_rows = list(csv.reader(csvfile, delimiter=',', quotechar='|'))
print (csv_rows)
>
>
>
[['First Name', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'] # I gave an example of the function outputting a header row

これまでのところ、openpyxlにはこのような関数はありません。私は間違っているかもしれないので、あなたの誰かが私を助けることができるかどうか疑問に思っています。

更新

@alecxe、あなたのソリューションは完全に機能します(私の生年月日を通常の文字列ではなく日時形式としてキャストすることを除いて)。

def iter_rows(ws):
for row in ws.iter_rows():
    yield [cell.value for cell in row]
>
>
>>> pprint(list(iter_rows(ws)))
[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'], ['John', 'Smith', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']]

私は初心者なので、リスト内包表記の代わりにforループを使用した場合にこれがどのように機能するかを知りたいと思いました。

だから私はこれを使いました:

def iter_rows(ws):
result=[]
for row in ws.iter_rows()
    for cell in row:
        result.append(cell.value)
yield result

それalmostはまったく同じ出力を私に与えますが、代わりにこれを与えます:ご存知のように、それは本質的にあなたが私に与えた結果。

>>>print(list(iter_rows(ws)))

[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex', 'David', 'Yao', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']]
11
dyao

iter_rows() はおそらく同じような意味を持っています:

ジェネレータを使用して、range_stringパラメータに基づいて2乗した範囲を返します。範囲が渡されない場合、ワークシートのすべてのセルを反復します

>>> from openpyxl import load_workbook
>>> 
>>> wb = load_workbook('test.xlsx')
>>> ws = wb.get_sheet_by_name('Sheet1')
>>> 
>>> pprint(list(ws.iter_rows()))
[(<Cell Sheet1.A1>,
  <Cell Sheet1.B1>,
  <Cell Sheet1.C1>,
  <Cell Sheet1.D1>,
  <Cell Sheet1.E1>),
 (<Cell Sheet1.A2>,
  <Cell Sheet1.B2>,
  <Cell Sheet1.C2>,
  <Cell Sheet1.D2>,
  <Cell Sheet1.E2>),
 (<Cell Sheet1.A3>,
  <Cell Sheet1.B3>,
  <Cell Sheet1.C3>,
  <Cell Sheet1.D3>,
  <Cell Sheet1.E3>)]

これを少し変更して、行の値のリストを生成できます。次に例を示します。

def iter_rows(ws):
    for row in ws.iter_rows():
        yield [cell.value for cell in row]

デモ:

>>> pprint(list(iter_rows(ws)))
[[1.0, 1.0, 1.0, None, None],
 [2.0, 2.0, 2.0, None, None],
 [3.0, 3.0, 3.0, None, None]]
12
alecxe

私はこの方法を使用してそれを動作させました:

all_rows = []

for row in worksheet:
    current_row = []
    for cell in row:
        current_row.append(cell.value)
    all_rows.append(current_row)

基本的に、私はすべてのデータのリストを作成しました。次に、ワークシートの各行を繰り返し処理しました。各cell.value行内の短期リスト(現在の行)に追加されました。一度すべてのcell.values行内の短期リストに追加され、短期リストが長期リストに追加されます。

2
Joseph Zullo