見出し画像

【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列) 

画像1

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行ずつ書き込む方法について書いていきたいと思います。

最後まで読んでいただき、ありがとうございました!

この記事が気に入ったらサポートをしてみませんか?