Pythonでxlsmファイルを読み込み&書き込みする方法

Pythonを使って、xlsmファイルを操作する方法について解説します

xlsmファイルを読み込む(pandas)

pandas を使って、xlsmファイル内の情報を DataFrame として取得します

DataFrameで取得すると、xlsmファイル内の情報を確認するのがとても便利です

そのため、読み込みには pandas がお勧めです

一方で
pandasは、xlsmファイルへの書き込みや保存はあまり得意でありません

xlsmファイルへの書き込み&保存は、後述のopenpyxl を使用します

コードの一例です

import pandas as pd

fp = r"C:Users\nobby\file.xlsm"
sheet_name = "Sheet1"

df = pd.read_excel(
       fp, 
       engine = 'openpyxl', 
    sheet_name=sheet_name,
       parse_dates=['日付'],
       header=None,
    index_col='日付',
       skiprows=2,
       skipfooter=1,
       usecols=['日付','値'],
       encoding='cp932'
       )

引数について

fp。必須
『\』がエスケープ文字として認識されないように、“”の左に r を付けるのがポイント
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position … というエラーが出た場合はこれで解決

engine = ‘openpyxl’。任意
エラーが出る場合はこれで解決。openpyxl のインストールも必要

sheet_name = シート名。任意
指定しなければ、1番左のシートが指定される
添字(数字)での指定も可

parse_dates = [列名]。任意
float型(20230130) を timestamp型(2023-01-30 00:00:00)として読み込む

header = None。任意
指定しなければ、一番上の行がラベルとなる

index_col=列名。任意
指定しなければ、左側にインデックスが追加される
添字(数字)での指定も可

skiprows = 行数。任意
上から行数分だけ行を削除する

skipfooter= 行数。任意
下から行数分だけ行を削除する

usecols=[列名]。任意
取得したい列を指定できる
添字(数字)での指定も可

encoding=’cp932’。任意
“髙”や”崎”などshift_jisにない文字も読みこめるようになる
‘shift_jis’ codec can’t decode byte 0x87 … というエラーが出た場合はこれで解決

encoding=’Shift_JIS’。任意
‘utf-8’ codec can’t decode byte 0x93 … というエラーが出た場合はこれで解決

xlsmファイルを読み込む&書き込む&保存する(openpyxl)

xlsmファイルの中身を確認したり何かしらの情報を得るのは、openpyxl はあまり得意ではありません
一方で、xlsmファイルへの書き込み&保存は、openpyxl がお勧めです

コードの一例です

import openpyxl

fp1 = r"C:Users\nobby\file.xlsm"
fp2 = r"C:Users\nobby\file2.xlsm"
sh_name = 'DATA'

wb = openpyxl.load_workbook(fp1, keep_vba=True)

ws = wb[sh_name]
max_row=ws.max_row + 1

ws.cell(row=max_row, column=1).value = "20230401"
ws.cell(row=max_row, column=2).value = "D"
ws.cell(row=max_row, column=3).value = 4

wb.save(fp2)

xlsmファイルを読み込む (openpyxl)

load_workbook を使って、xlsmファイルを読み込みます

引数について

fp1。必須
『\』がエスケープ文字として認識されないように、””の左に r を付けるのがポイント
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position … というエラーが出た場合はこれで解決

keep_vba = True。必須
指定していないと、xlsmファイルに書き込み → 保存 → 開く時に、
ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください
というエラーが表示されます

xlsmファイルに書き込む

ws = wb[sh_name]

シート名を指定します

max_row=ws.max_row + 1

max_row で、ws の 最終行を取得します

ws.cell(row=max_row, column=1).value = "20230401"
ws.cell(row=max_row, column=2).value = "D"
ws.cell(row=max_row, column=3).value = 4

最終行の下の行に、値を入力します

xlsmファイルを保存する

save を使って、xlsmファイルを保存します

コメント

この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
タイトルとURLをコピーしました