【Python】「OpenPyXL」で「Excel」のセルの値を取得・入力するなどセルを操作してみよう

python

みなさんこんにちは。zak-papaです。

 

前回はExcelを自在に操れる「OpenPyXL」のインストールから、「ワークブック」「ワークシート」の基本操作についてご紹介しました。3ステップのうちの1つ目と2つ目ですね。

python【Python】「OpenPyXL」で「Excel」のワークブック、ワークシートを操作してみよう

 

「OpenPyXL」でExcel操作をするための3ステップ
  1. ワークブックの取得(指定)
  2. ワークシートの取得(指定)
  3. セル範囲の取得(指定)

Excelファイル

 

 

では、今回は3つ目の「セル」に対して、値を取得したり入力したり色々と操作をしていきたいと思います。順番に見ていきましょう。

 

「セル」を操作する準備をしょう

事前準備

前回は下記の動作環境で作業していました。前回に続いて今回も同じ環境で作業していきます。

OS macOS Catalina 10.15.3 Version Python 3.7.4
エディタ Visual Studio Code ブラウザ Google Chrome
ディレクトリ Desktop/openpyxl ファイル openpyxl_practice.py

 

また、Excelファイルは「openpyxl_practice.xlsx」という名前で同じフォルダ内に保存して作業していました。

Desktop_openpyxl

準備ができたら、次から「セル」の操作方法を見ていきましょう。

 

 

「セル」を操作してみよう

「1つずつ」セルに値を「入力」する

まずは、1つずつセルに値を「入力」してみます。

セルに1つずつ値を入力するには、「ws['A1'] = 値」のようにセルを指定して記載します(A1表記)。
10行目のように「関数」も「クォーテーション」で囲むことで入力することが可能です。

では、「A1」から「A4」のセルに値を入力してみましょう。
※ 一番左の「firstsheet」を「アクティブ」なシートとして取得。次回以降最初の「3行」は割愛します。

 

関数もしっかりと反映されましたね。

A1表記

 

また、「行」と「列」を指定する「R1C1表記」でもセルに値を入力することができ、次のように「cell()」の引数に「row = 行数」、「column = 列数」、「value = 」を指定します。

入力方法は「2パターン」あり、「B1〜B4」、「C1〜C4」のセルにそれぞれの方法で入力してみます。

 

どちらのパターンでも入力できました。

R1C1表記

 

 

「1つずつ」セルの値を「取得」する

続いて、1つずつセルの値を「取得」してみます。
セルの値を取得する場合も上記同様「A1表記」と「R1C1表記」どちらでも取得することができます。

では、次の「A1」と「B1」のセルの値を取得してみましょう。

データ取得

 

コードはこちら。「value」属性を付けて取得します。

 

「1」と「4」を取得できましたね。

セルの取得_A1_B1

 

 

 

「複数のセル」を操作してみよう

「複数」のセルに値を「入力」する

続いて、「複数」のセルに一括で値を「入力」する方法を見ていきましょう。

「append」を使って「行ごと」に値を入力することができます。「append」を使うと自動的にデータの「最終行」の次の行から入力してくれるため、特にセルの範囲を指定する必要はありません。

次のコードは、appendの引数に「リスト型」のデータを渡して、データのある最終行の次の行(5行目)に入力するコードです。「複数行」を追加する場合は「for文」でループさせます。

 

5行目から7行目にデータが入力されましたね。

append

 

 

「複数」のセルの値を「行ごと取得」する

今度は、「複数」のセルの値を「取得」してみましょう。
「行ごと」「列ごと」「すべて」の3パターンの取得方法について見ていきます。


まずは、「行ごと」にデータを取得します。先ほどのExcelファイルの「3行目」を取得してみましょう。

3行目のデータ

 

下記のように「行数(3)」を指定して取得します。この場合は「値」の取得ではなく、「セルオブジェクト」の取得になります。

 

「firstsheet」の「A3〜C3」までのセルオブジェクトを取得できました。

3行目のセルオブジェクト

 

 

この中から「値」を取得したい場合は「value」属性を付けます。
「特定の値」のみ取得したい場合は「インデックス」で指定し、すべて取得したい場合は「for」文でループさせます。

 

どちらも取得できました。

3行目の値を取得

 

 

では、「4行目」の「関数」が入っているセルについてはどうでしょうか。「4行目」のセルの値をすべて取得してみます。

 

計算結果(6, 15, 24)が欲しいのに「関数式」がそのまま取得されてしまいました。

4行目の値の取得

4行目

 

 

実は、関数式が含まれる場合はもう一手間加える必要があります。
最初の方で「load_workbook」関数の引数に「ファイル名」を指定したと思いますが、ここにもう1つ「data_only=True」を付け加えると「数式」ではなく計算されたあとの「値」を取得することができます。

ただし!
先にお伝えしておくと、実は今回の場合はそのまま追記して実行するだけでは値を取得できません。「None」という値が返ってきます。

 

4行目_None

 

 

どうやら、OpenPyXLから数式を入力した場合は数式の値を取得できず、一度Excelファイルを開いて「上書き保存」しないといけないらしいです…。ちょっと面倒ですね。Excelで入力した数式であればそのまま取得できます。

なので、今回は一度ファイルを開いて上書き保存し、気を取り直して再度実行してみましょう。

4行目の値の取得

 

ようやく値を取得することができました。

 

 

最後に「1行のみ」の値ではなく、「複数行」の値を取得してみましょう。「3行目」と「4行目」の値を取得してみます。

3行目と4行目

 

まずは、2行目のように「スライス」で範囲を指定します。その後「for」文を2回使って取得します。
なお、1つ目の「for」文は「行(3行目)」を取得し、2つ目の「for」文で「3行目の各セル(A3,B3,C3)」を取得しています。そして続けて4行目についても同じ処理が繰り返されます。

 

3行目と4行目の値を左上のセルから順(A3,B3,C3,A4,B4,C4の順)に取得できましたね。

3行目と4行目の値

 

 

ちなみに、「A3:B4」のように行全体ではない範囲でも、同じように範囲を指定すれば取得することができます。

A3_B4

 

今回は値の取得だけでなく、「coordinate」属性も付けて「セルの位置情報」も取得してみましょう。

 

A3,B3,A4,B4の順に「位置情報」と「値」が取得できましたね。「coordinate」属性の使い方も覚えておくと便利です。

A3_B4_coordinate

 

 

「複数」のセルの値を「列ごと取得」する

続いて、「列ごと」にデータを取得します。では、「C列」の値を取得してみましょう。

C列

 

「行ごと」と同じように取得したい列(C)を指定します。「for」文ですべての値を取得してみます。

 

データが入力されている「C1」から「C7」までの値を取得することができました。

C列の値を取得

 

 

では、こちらも同じように「1列のみ」の値ではなく、「複数列」の値を取得してみましょう。「A列」と「B列」の値を取得してみます。

A列とB列

 

「行ごと」と同じように取得することができます。取得する「範囲」を変えればいいだけですね。
取得するデータ量が多くなってわかりにくくなるので、「coordinate」属性も一緒に付けて出力してみましょう。

 

少し長くなってしまいましたが、「A1〜「A7」「B1」〜「B7」の順に2列分取得できています。

A列とB列の値_coordinate

 

 

「複数」のセルの値を「すべて取得」する

最後にシートにある「すべて」のデータを取得してみましょう。

次のように「ws.values」とするだけで、データ範囲を指定しなくてもすべての値を取得できます。
こちらも「for」文を2回使用してすべての値を取得できますが、「for」文1回で「行ごと」のデータをタプル型で取得できます。

 

データのある「1行目」から「7行目」までを「行ごと」に取得できましたね。

行ごとのデータ_タプル

 

では、さらに「for」文を使って、すべての値を「1つずつ」取得してみましょう。

 

最初の3行のみ表示しておりますが、「A1,B1,C1,A2,B2,C2...」 の順に「7行目」まですべて出力されていると思います。

すべての値を取得

 

 

 

「iter_rows()」「iter_cols()」メソッド

「行ごと」「列ごと」に値を取得する他の方法に「iter_rows()」「iter_cols()」メソッドがあります。

次のように「行番号」と「列番号」を指定し、「values_only=True」を付けることで「値」を取得することができます。
試しに「1行目」と「2行目」の値を取得します。

1行目と2行目

 

 

iter_rows

 

 

続いて、「iter_cols()」メソッドで「A列」と「B列」の値を取得します。データ量が多いので「4行目」まで取得することにします。

A列とB列

 

 

iter_col

 

 

ちなみに、すべての値を取得したい場合は「最終行(7)」と「最終列(3)」を入れれば良いですが、毎回数えて入力していられません。

「最終行」を取得する「max_row」、「最終列」を取得する「max_column」を使えばデータ量が変わっても手直しすることなくすべての値を取得することができます。

では、上記を使ってすべての値を取得してみましょう。

 

max_column_max_row

 

 

  終わりに

以上、「OpenPyXL」で「Excel」の「セル」の値を取得したり入力したりする方法をお伝えしました。

前回の「ワークブック」「ワークシート」の操作と今回の「セル」の操作がわかれば基本的な作業ができるのではないでしょうか。

「セル」操作は今回の値の取得・入力以外にも「結合」や「コピー」、「削除」など他にもセルを操作する方法があります。そのあたりは別途ご紹介したいと思います。

前回もお伝えした通り、「公式サイト(OpenPyXL)」があるので、是非そちらも参考に業務効率化を図っていただければと思います。

 

以上となります。最後まで読んでいただきありがとうございました!