【Python】Excelを操作してみる②
どうも、こまです。
今日は、PythonでのExcel操作の第二回目ということで、Pythonプログラムでセルの値を読み書きしていきたいと思います。
ちなみに前回は、ブック(ファイル)の読み込み・保存について解説しているので、よかったら覗いてみてください。
セルの値を読み書きするには、まずブックの中から対象のシートを取得し、そのシート内のセルをアドレスで指定します。
(ブック→シート→セル の順ですね)
シートを指定する2つの方法
まずは前回の復習ですが、ブックの指定ですね
import openpyxl
wb = openpyxl.load_workbook("Excelファイル名")
この記述の後に以下を追記することで、シートを取得できます
■シート名で指定する
ws = wb["シート名"]
■0から始まる番号(インデックス番号)で指定する
ws = wb.worksheets[番号]
セルの取得
シートの中から1つのセルを取得するには、「セル番地」と「行列番号」による2通りの指定方法があります
※シートの指定は0からでしたが、行列番号の指定は1から始めます
(行番号=1、列番号=1が 「A1セル」になる)
■セル番地で指定
import openpyxl
wb = openpyxl.load_workbook("売上データ.xlsx")
ws = wb["8月売上"]
# セル番地で指定
c = ws["A1"]
print(c.coordinate) # セル番地を出力
print(c.row) # 行番号を出力
print(c.column) # 列番号を出力
■1から始まる行列番号で指定
import openpyxl
wb = openpyxl.load_workbook("売上データ.xlsx")
ws = wb["8月売上"]
# 行列番号で指定
c2 = ws.cell(1, 1)
print(c2.coordinate) # セル番地を出力
print(c2.row) # 行番号を出力
print(c2.column) # 列番号を出力
セルの値を読み取る
# 変数cにセルが代入されている場合
c.value
「売上データ.xlsx」 の「8月売上」シートが下のような表だったとします
※ 計(F列) = 単価(D列) × 数量(E列)
import openpyxl
wb = openpyxl.load_workbook("売上データ.xlsx")
ws = wb["8月売上"]
c1 = ws["A4"]
print(c1.value)
c2 = ws["B4"]
print(c2.value)
c3 = ws["C4"]
print(c3.value)
c4 = ws["D4"]
print(c4.value)
c5 = ws["E4"]
print(c5.value)
c6 = ws["F4"]
print(c6.value)
・実行結果例
2021-08-01 00:00:00 ← 日付のセル
あいうえお株式会社
商品C
1200
20
=D4*E4 ← 数式のセル
数値や文字列のデータはセルに表示されている通りに取得できます
ですが、
日付や数式はセルの表示と異なっています
・日付
Pythonの表示では、「2021-08-01 00:00:00」と時刻まで表示されています
→日付が入力されているExcelのセルからは、datetime型という日時専用のデータ型で値が取得されている
→Excelの日付は「シリアル値」という特殊な数値で管理されていて、シリアル値に日付の表示設定をしていると、セルには日付で表示される
opnepyxlでは、データの読み込み時にセルの表示形式を確認し、日付なら「datetime型」で値を取得する
・数式
数式の計算結果ではなくて、数式そのものが取得されています
→load_work() に、data_only=True を記入すると、計算結果を取得できる
wb = openpyxl.load_workbook("売り上げデータ.xlsx", data_only=True)
セルに値を書き込む
# 変数cにセルが代入されている場合
c.value = 値
・文字列のセル
"商品A"のように、文字列をセルに代入する
・数値のセル
2400のように、数値をセルに代入する
・数式のセル
"=D4*E4" のように、文字列で数式を作ってセルに代入する
・日付のセル
datetime型という日付専用のデータ型で代入する
import datetime
# 日付データ
d = datetime.datetime(年, 月, 日)
# 日付 + 時刻 データ
dt = datetime.datetime(年, 月, 日, 時, 分, 秒)
セルの表示形式を設定する
Excelのデータの種類は、大きく分けて「文字列」「数値」「数式」の3種類日付は、Excelでは「数値」として扱われる(シリアル値)
数値の表示形式も openpyxl で設定できる
# 変数c にセルが代入されている場合
c.number_format = 表示形式 #ユーザー定義の書式記号
・よく用いる日付の書式記号
yyyy/mm/dd → 2021/08/01
yyyy/m/d → 2021/8/1
yyyy/mm/dd hh:mm:ss → 2021/08/01 09:30:00
yyyy/mm/dd h:mm:ss → 2021/08/01 9:30:00
・よく用いる数値の書式記号
#,##0 → 1,200(1200を入力した場合)
0000 → 0020(20を入力した場合)
#### → 20(20を入力した場合)
0.0 → 12.0(12を入力した場合)
Sample
c1.value = datetime.datetime(2021, 8, 1)
c1.number_format = "yyyy/m/d"
c2.value = 2400
c2.number_format = "#,##0"
結構ボリュームあったかもしれませんが、エクセル操作はまだまだ続きます
次回は、Excelファイルを1行ずつ読み込んで、1行ずつ書き込む方法について書いていきたいと思います。
最後まで読んでいただき、ありがとうございました!
この記事が気に入ったらサポートをしてみませんか?