第24回.エクセルを操作する(openpyxl)
PythonでExcelファイルを扱ってみましょう。
それには、外部ライブラリのopenpyxlを使うと便利ですし、簡単に扱う事が出来ます。
ここではopenpyxlの基本的な使い方を、
ブック、シート、セル、そしてセルの書式(ただし一部だけ)の順にコードサンプルで解説していきます。
目次
openpyxlのインストール
Visual Studio
ここに「openpyxl」これを入れてください。
文字を入れた後にEnterするとそのままインストールされます。
コマンド プロンプト
詳しくは以下を参照してください。
公式リファレンス
上掲は、この下のサンプルで使っている部分だけの極一部のリンクです。
非常に膨大な資料なので、とても全てを読むことはできませんし、その必要も無いと思います。
必要になった時点で調べられるようにしておけば良いと思います。
一部しか結果のprintの画像は載せていませんので、気になるところは実際に実行して確認してみてください。
ブックの操作
既存ブックを読み込む
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
次はパスの確認をしてから読み込むサンプルです。
from pathlib import Path
import openpyxl
p = Path("./Book1.xlsx")
if p.exists():
wb = openpyxl.load_workbook(p)
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsm", keep_vba=True)
これを指定せずにマクロ有効ブックを読み込んだ場合、
セル値等は取得出来ますが、保存した時に正しく保存されなくなります。
新規ブックを作成する
import openpyxl
wb = openpyxl.Workbook()
ブックを保存する
import openpyxl
wb = openpyxl.Workbook()
wb.save("Book11.xlsx")
上書き保存は無いようです。
シートの操作
シート一覧を取得
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
print(wb.sheetnames)
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
shts = wb.worksheets
print(shts)
シート名で取得
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
print(ws)
シートのインデックスで取得
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb.worksheets[0]
print(ws)
シート名の変更
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
ws.title = "Sheet99"
print(ws)
シートの挿入
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb.create_sheet("add_sheet", 2)
print(ws)
指定インデックスの前に挿入されます。
シートの削除
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["add_sheet"]
print(wb.sheetnames)
wb.remove(ws)
print(wb.sheetnames)
セルの操作
単一セルの取得
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng1 = ws["A1"]
print(rng1)
rng2 = ws.cell(2, 2)
print(rng2)
複数セルの取得
from pprint import pprint
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng = ws["A1:C3"]
pprint(rng, width=20)
セル値の取得
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng = ws["A1"]
print(rng.value)
セル値を設定
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng1 = ws["A1"]
rng1.value = 123
print(rng1.value)
rng2 = ws.cell(2, 2, "abc")
print(rng2.value)
データ最終行列の取得
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet2"]
print(f"{ws.min_row=} {ws.min_column=} {ws.max_row=} {ws.max_column=}")
したがって、書式設定されているだけでも範囲に含まれます。
範囲内の順処理
from pprint import pprint
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
print("iter_cols")
[pprint(rng, width=20) for rng in
ws.iter_cols(min_col=ws.min_column, max_col=ws.max_column, min_row=ws.min_row, max_row=ws.max_row)]
print("iter_rows")
[pprint(rng, width=20) for rng in
ws.iter_rows(min_col=ws.min_column, max_col=ws.max_column, min_row=ws.min_row, max_row=ws.max_row)]
iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)
min_row (int) : smallest row index (1-based index)
max_col (int) : largest column index (1-based index)
max_row (int) : largest row index (1-based index)
values_only (bool) : whether only cell values should be returned
,values_only=True
これを指定してください。
行の挿入・削除
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
#1行目に挿入
ws.insert_rows(1)
#1行目に3行挿入
ws.insert_rows(1, 3)
#1行目を削除
ws.delete_rows(1)
#1行目から3行削除
ws.delete_rows(1, 3)
delete_rows(idx, amount=1)
列の挿入・削除
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
#1列目に挿入
ws.insert_cols(1)
#1列目に3列挿入
ws.insert_cols(1, 3)
#1列目を削除
ws.delete_cols(1)
#1列目から3列削除
ws.delete_cols(1, 3)
delete_cols(idx, amount=1)
表示形式・フォント・罫線・列幅・行高
表示形式
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
ws["A1"].number_format = '#,##0'
ws.cell(2, 2).number_format = "0.00%"
フォント
import openpyxl
from openpyxl.styles import Font
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
font = Font(name="MS Pゴシック", bold=True, size=14)
ws["A1"].font = font
ws.cell(2, 2).font = font
罫線の設定
import openpyxl
from openpyxl.styles.borders import Border, Side
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
#細線、色は自動
side = Side(style="thin")
border = Border(top=side, bottom=side, left=side, right=side)
ws["A1"].border = border
#普通線、色は赤
side = Side(style="medium", color="FF0000")
border = Border(top=side, bottom=side, left=side, right=side)
ws.cell(2, 2).border = border
複数セルに一括で罫線を引くことはできないようです。
罫線の種類
style | 線種 | 太さ |
hair | 極細 | |
thin | 細線 | |
medium | 普通 | |
thick | 太線 | |
double | 2 本線 | |
dotted | 点線 | 普通 |
dashed | 破線 | 普通 |
dashDot | 一点鎖線 | 普通 |
dashDotDot | ニ点鎖線 | 普通 |
slantDashDot | 斜破線 | 普通 |
mediumDashed | 破線 | 普通 |
mediumDashDot | 一点鎖線 | 普通 |
mediumDashDotDot | ニ点鎖線 | 普通 |
列幅・行高
import openpyxl
from openpyxl.styles.borders import Border, Side
from openpyxl import utils
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
ws.row_dimensions[2].height = 30 #ポイント
ws.column_dimensions["B"].width = 20 #文字数
ws.column_dimensions[utils.get_column_letter(3)].width = 30 #文字数
utils.column_index_from_string : 列文字から数値
CSVを読み込んでエクセルで出力
1行目は列名になっています。
UTF-8(BOMなし)です。
列名は1行目だけに出力します。
この結果をExcelファイル"file99.xlsx"として出力します。
from pathlib import Path
import csv
import openpyxl
from openpyxl.styles.borders import Border, Side
from openpyxl.styles import Font
#ファイルのリストを受け取り読み込み2次元配列で返す
def read_csv(arg_files):
row = []
for file in arg_files:
with open(file, "r", encoding="utf-8") as f:
reader = csv.reader(f)
for r in reader:
row.append(r)
return row
#2次元配列をワークシートの指定位置に書き出す
def list_to_cell(arg_list, arg_ws, start_row=1, start_col=1):
for r, row in enumerate(arg_list):
for c, col in enumerate(row):
arg_ws.cell(start_row + r, start_col + c, col)
#以下でも同じ
#arg_ws.cell(start_row + r,start_col + c).value = arg_list[r][c]
set_cell_format(arg_ws.cell(start_row + r,start_col + c))
#フォントと罫線の設定
def set_cell_format(arg_cell):
font = Font(name="MS Pゴシック", bold=True, size=14)
arg_cell.font = font
side = Side(style="thin")
border = Border(top=side, bottom=side, left=side, right=side)
arg_cell.border = border
#csvを読み込みリストにまとめる
p = Path("./test")
files = list(p.glob("*.csv"))
csv = read_csv(files)
#エクセルとして出力
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
ws.title = "CSV"
list_to_cell(csv, ws)
wb.save(p / "file99.xlsx")
同じテーマ「Python入門」の記事
第16回.Pythonの引数は参照渡しだが・・・
第17回.リスト内包表記
第18回.例外処理(try文)とexception一覧
第19回.import文(パッケージ・モジュールのインポート)
第20回.フォルダとファイルの一覧を取得(os,glob,pathlib)
第21回.CSV読み込みとopen()関数とwith文
第22回.CSV読み書き(csvモジュール)
第23回.pipコマンド(外部ライブラリのインストール)
第24回.エクセルを操作する(openpyxl)
第24回.エクセルを操作する(pywin32:win32com)
第26回.WEBスクレイピング(selenium)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。