0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

openpyxlをうす〜く理解しよう~その1/3(値編)

Last updated at Posted at 2024-04-22

はじめに

なんやかんや言ってもエクセルを使う場面って多い。
そして、見せる資料としても、チェックする資料としても活躍の場が多い。
なので、エクセルに書き込んで、体裁を整えるためのチートとして活用していただければ!
と思ったけど、なかなか深い。うん、深い。
なので、うす〜く、さらっとopenpyxlを理解したいと思います。

ざっぱに、今回の内容はこんな感じ

  1. ファイルの読み込みから保存
  2. openpyxlでエクセルを操作するための準備
  3. セルの値の取得
  4. 行番号とカラムの取得
  5. いったん、ここいらで中締め

まずはここまで。

環境

MacBookAir 2020 M1
python=3.10.8
openpyxl=3.1.2
インストールはpip install openpyxlで!
あんまり関係ないわな。

openpyxl

言わずと知れたopenpyxlのドキュメントがこちら。正直、よくわからん。マジでわからん。
なので僕なりに整理した順に追っていく。

ファイルの読み込みから保存

面倒なんで、シートの読み取りもしくはシートの作成、保存までやちゃいましょう。



  • 既存のエクセルファイルを読み取って、既存のシートの読み込み
import openpyxl

workbook = openpyxl.load_file('ファイル名')
worksheet = workbook['Sheet1']

workbook.save('ファイルパス')


  • 新しくopenpyxlのインスタンスを作って、新しいシートの作成
from openpyxl import Workbook

workbook = Workbook()
worksheet = workbook.create_sheet('created_sheet', 0)

workbook.save('ファイルパス')

create_sheetの引数の0は0番目の順番の位置にシートを作る。だからなくてもOK。



この辺はチュートリアルに書いてある
https://openpyxl.readthedocs.io/en/stable/tutorial.html





openpyxlでエクセルを操作するための準備


こんなエクセルを作りました。ファイル名は`test.xlsx`、シート名は`Sheet1`

スクリーンショット 2024-04-16 18.04.24.png

こいつを操作というか、読み取ることから確認していきましょうね。

まずは読み込み

import openpyxl

workbook = openpyxl.load_file('./test.xlsx')
worksheet = workbook['Sheet1']

シートのの行列数の取得方法

  • 行数の取得
max_row = worksheet.max_row
print(max_row)

出力は4
worksheetにmax_rowを渡してあげると入力されたセル数が取れる。こうなるとcolumn側もわかるよね。

  • 列数の取得
max_col = worksheet.max_column
print(max_col)

出力は4
はい、想像つきましたね。はい。
あ、縦横で入力セル数を変えればよかった。

ではどんどんいきます。



セルの値の取得

エクセル座標とindex座標

エクセルの座標で指示する方法と、リストのようにインデックスで指定する方法があります。

  • エクセル座標の指定方法
print(worksheet['A1'])
print(worksheet['A1'].value)

出力は

<Cell 'Sheet1'.A1>
1-1

わかりますねー。
worksheet['A1']でセルのインスタンスが取れて、それにvalueを渡すと中の値が取れます。



  • インデックスで指定する方法
print(worksheet.cell(row=1, column=1))
print(worksheet.cell(row=1, column=1).value)

出力は全く同じ。つまり、どっちの方法でもOK。

<Cell 'Sheet1'.A1>
1-1


じゃ、行ごと、列ごとの取得は?


  • 列の取得
print(worksheet['A'])

出力

(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>)

タブルで全てのセルが帰ってきます。for文で回してあげれば値も取得できますね。
ですが、worksheet['A'].valueはだめ。タプルにvalueは使えませんよとエラーが返ってきます。
ちなみにworksheet.cell(column=1)をしてもrowの値がないぞとエラーが出ます。



  • 行の取得
print(worksheet[1])

出力

(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>, <Cell 'Sheet1'.D1>)

はい、行ごと取れましたね。
これも列ごとと同じパターンの模様。



じゃ、ここからセルに入力していこう

値を入力

値の入力はこのあたりに書いてある。一括でデータを入れるなら便利。一個ずつ入れる方法もある。
https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html

ここで、理解しておきたい内容だけを公式から抜粋して解説。シンプルにいきましょう。

# ライブラリのインポート
from openpyxl import Workbook

# openpyxlのインスタンスを作って、シートを作って
wb = Workbook()
ws = wb.active

# データをリストで作る
data = [
    ['Apples', 10000, 5000, 8000, 6000],
    ['Pears',   2000, 3000, 4000, 5000],
    ['Bananas', 6000, 6000, 6500, 6000],
    ['Oranges',  500,  300,  200,  700],
]

# シートにアペンドしていけば上から順に入力されていくので、最初にカラム名を挿入して
ws.append(["Fruit", "2011", "2012", "2013", "2014"])

# リストで作ったデータを1行ずつアペンドして入力していく
for row in data:
    ws.append(row)

# 保存
wb.save("table.xlsx")

データを作って、行ごとアペンドしてあげれば入力可能。



特定のセルへの値の入力

もう、大丈夫ですよね。こんな感じ。

worksheet.cell(row=1, column=2) = 5
worksheet['A2'] = 5


入力文字のタイプの判別

worksheet.cell(row=1, column=2).data_type

s
stringの意味かな?



worksheet.cell(row=2, column=2).data_type

n
numberの意味かな?Pythonなんだからintのiとかfloatのfで出てくれればいいのに。
あ、一文字じゃなくてもいいよね。



そして気になるTRUE/FALSE

worksheet.cell(row=2, column=4).data_type

b
boolenbかな



行番号とカラムの取得

カラムのアルファベットの取得(B1のBを取得)

worksheet.cell(row=2, column=2).column_letter

B
2列目はB

カラムのインデックスの取得(B2のセル)

worksheet.cell(row=2, column=2).col_idx

2
2番目のカラム


この書き方もできますね。

worksheet['B'][0].col_idex

2
出力は同じ。


いったん、ここいらで中締め

長くなりそうなんで、ここでいったんシメます。
ここまでできれば値は自由に入れ替えできそうです。
次回は見やすくするために色をつけていきましょうかね。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?