.NET開発者のためのブログメディア
PythonでのExcelの操作方法4つ|マクロ作成で使えるパッケージも紹介
- SE
- PythonでExcelを扱うメリットについて、教えてください。
- PM
- そうですね。大量のデータを分析する際にはPythonを利用すれば短時間で処理できます。
目次
PythonでExcelを操作する2つの方法とは?
ここではPythonでExcelを操作するための2つのライブラリについて説明します。xlsxのファイルを直接編集するものとExcelをWin32 APIを通して扱うものです。
様々なライブラリが存在しますが、openpyxlとpywin32に焦点をあてて説明します。
openpyxlの特徴
Excelのxlsx/xlsm/xltx/xltm(Office Open XML)形式のファイルを操作するためのライブラリです。xlsx/xlsm/xltx/xltm形式のファイルを直接操作するため、Excel本体が無い場合でも作成したアプリケーションが実行可能です。
pywin32の特徴
Win32 API経由でExcelを操作するためのライブラリです。PythonからExcel本体を操作するためExcel本体が必須となります。
Access-VBAからExcelを操作するプログラムの作成経験がある方には、Excelを操作しているコードはそれほど違和感がないかもしれません。
PythonでのExcelの操作方法4つ
今回は、Pythonからopenpyxlを使用したExcelの扱い方について説明します。ここでは、ワークブック、ワークシート、セル、グラフについて紹介します。
PythonでExcelを扱うには事前にopenpyxlをインストールしてください。
1
|
pip install openpyxl
|
1:ワークブック
Pythonでのワークブックの扱い方について紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
import openpyxl
# workbookの新規作成
workbook = openpyxl.Workbook()
# workbookの保存
workbook.save('python.xlsx')
|
実行すると、カレントディレクトリに「python.xlsx」という名前のExcelファイルが作成されます。Excelで開いて確認してみてください。
1
2
3
4
5
6
7
8
9
|
import openpyxl
# workbookを開く
workbook = openpyxl.load_workbook("python.xlsx")
# workbookを別名保存
workbook.save('python2.xlsx')
|
実行すると、カレントディレクトリに「python2.xlsx」という名前のExcelファイルが作成されます。
2:ワークシート
PythonでのExcelのワークシートの扱い方について紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import openpyxl
# workbookを開く
workbook = openpyxl.Workbook()
########################
### 全シート名を表示 ###
########################
print(workbook.sheetnames) # ['Sheet']
##############################
### シートの取得、名前変更 ###
##############################
print('シートの取得、名前変更')
# シートを取得
worksheet = workbook.active
# シート名を表示
print(worksheet.title) # Sheet
# シートインデックス(先頭のシートは0)を表示
print(workbook.index(worksheet)) # 0
# シート名を変更
worksheet.title = 'mysheet1'
# シート名を表示
print(worksheet.title) # mysheet1
####################
### シートの追加 ###
####################
print('シートの追加')
# シート追加
worksheet3 = workbook.create_sheet(title="mysheet3")
# 全シート名を表示
print(workbook.sheetnames) # ['mysheet1', 'mysheet3']
# シート追加(指定indexに追加)
worksheet3 = workbook.create_sheet(title="mysheet2", index=1)
# 全シート名を表示
print(workbook.sheetnames) # ['mysheet1', 'mysheet2', 'mysheet3']
# シートの取得
worksheet = workbook["mysheet2"]
# シート名を表示
print(worksheet.title) # mysheet2
# シートの取得
worksheet = workbook.worksheets[2]
# シート名を表示
print(worksheet.title) # mysheet3
######################
### シートのコピー ###
######################
print('シートのコピー')
# シートコピー
worksheet = workbook.copy_worksheet(workbook["mysheet2"])
# 全シート名を表示
print(workbook.sheetnames) # ['mysheet1', 'mysheet2', 'mysheet3', 'mysheet2 Copy']
####################
### シートの削除 ###
####################
# シートを取得
worksheet = workbook.worksheets[3]
# シートを削除
workbook.remove(worksheet)
# 全シート名を表示
print(workbook.sheetnames) # ['mysheet1', 'mysheet2', 'mysheet3']
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
['Sheet']
シートの取得、名前変更
Sheet
0
mysheet1
シートの追加
['mysheet1', 'mysheet3']
['mysheet1', 'mysheet2', 'mysheet3']
mysheet2
mysheet3
シートのコピー
['mysheet1', 'mysheet2', 'mysheet3', 'mysheet2 Copy']
['mysheet1', 'mysheet2', 'mysheet3']
|
3:セル
PythonでのExcelのセルの扱い方について紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import openpyxl
# workbookを開き、シートを選択
workbook = openpyxl.Workbook()
worksheet = workbook.active
######################
### セルの読み書き ###
######################
# A1セルを取得
cell = worksheet["A1"]
# A1セルの値設定
cell.value = 100
# A1セルの値表示
print(cell.value) # 100
############################
### セルの読み書き(範囲) ###
############################
# 範囲を指定してセルを取得する
cells = worksheet['A1':'C3']
i = 0
for row in cells:
for cell in row:
cell.value = i
print('[' + cell.coordinate + '] : ' + str(cell.value))
i += 1
##########################
### セルの数式書き込み ###
##########################
cell = worksheet["D1"]
cell.value = "=SUM(A1:C3)"
print(cell.value) # =SUM(A1:C3)
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
100
[A1] : 0
[B1] : 1
[C1] : 2
[A2] : 3
[B2] : 4
[C2] : 5
[A3] : 6
[B3] : 7
[C3] : 8
=SUM(A1:C3)
|
数式の「計算結果」を取得したい場合は、load_workbookの引数に「data_only=True」を指定してください。ただし、計算はExcelが行うため、事前にエクセルで開いておかなければ「計算結果」は取得できません。
4:グラフ
PythonでのExcelのグラフの扱い方について紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import openpyxl
# workbookを開き、シートを選択
workbook = openpyxl.Workbook()
worksheet = workbook.active
# 値の設定
cells = worksheet['A1':'A10']
i = 1
for row in cells:
for cell in row:
cell.value = i
i += 1
# グラフの作成
from openpyxl.chart import BarChart, Reference, Series
values = Reference(worksheet, min_col=1, min_row=1, max_col=1, max_row=10)
chart = BarChart()
chart.add_data(values)
worksheet.add_chart(chart, "C1")
# workbookの保存
workbook.save("python.xlsx")
|
保存したExcelを開くと、Pythonで作成したグラフが表示されていることが分かります。
Pythonではマクロの作成も可能
VBAからPythonのコードを記述した.pyファイルを実行することができます。
たとえば外部パッケージのxlwingsを導入することにより、ボタンのマクロの登録メニューからPythonのプログラムを呼び出したり、ユーザー定義関数 (UDF)を作成してワークシート関数として使用したりすることもできます。
Pythonでマクロを作成するメリット3つ
Pythonでマクロを作成することには以下のメリットがあります。
・Pythonでの複雑な処理の必要がありません。
VBAとPython各々に適した機能を使用するように実装することができます。
・簡単な記述で作成できます。
Python用に公開されているライブラリを使用することにより、複雑な処理も容易に使用することができます。
・アプリケーションを超えた処理が可能です。
Pythonでそれぞれの処理に適した複数のアプリケーションを連携させることができます。
1:Pythonでの複雑な処理の必要がない
Pythonでマクロを作成することは可能ですが、全てをPython側で行う必要はありません。VBAにはVBAの得意な処理があり、各々が得意な分野の処理を実行するように切り分けて実装することができます。
2:簡単な記述で作成できる
外部アプリケーションを使用する場合、VBAでも操作するプログラムは公開されているAPIを使用することで可能ですが、Python用に公開されているライブラリも多く、また使用も容易です。
たとえば、PyAutoGUIの例で記述している
1
2
3
|
p= pa.locateOnScreen("btn.PNG", confidence=0.9)
|
は内部でOpenCV(Open Source Computer Vision Library)を使用して画像認識を行っています。
VBAで同様の処理を行う場合は、VBAで使用可能なOpenCVを使用した画像認識用のDLLを作成し、それを使って画像認識のためのプログラムを作成する必要があります。
3:アプリケーションを超えた処理が可能である
先述のとおり、Python用のライブラリが公開されているアプリケーションは数多く存在します。Pythonから目的に応じたアプリケーションを組み合わせて使用できます。
Webスクレイピングを実行して、結果をデータベースに書き込むという処理もPythonのプログラムのみで実装できます。
Pythonでのマクロ作成に活用できるパッケージ4つ
Pythonでマクロ作成に活用できるパッケージとして、今回は以下の4つについて説明します。
・PyAutoGUI:PythonでGUI操作の自動化を行うためのパッケージです。
・CSV:PythonでCSVファイルの読み込みや書き込みを行うための標準ライブラリです。
・python-docx:PythonでWordのDocumentの処理を行う外部パッケージです。
・PDFMiner.six:PythonでPDFの処理を行う外部パッケージです。
それぞれ以下でインストールして下さい。
1
2
3
|
pip install PyAutoGUI
pip install python-docx
pip install PDFMiner.six
|
PyAutoGUIのサンプルを実行する場合、パッケージの追加を要求した場合、それに従って追加インストールしてください。
1:PyAutoGUI
PyAutoGUIとはMicrosoft Power Automate Desktopのようにマウスのクリックやキーボード入力などを自動化するためのPythonのパッケージです。
事前にExcelのWorksheet上のボタンの座標もしくは画像を取得しておき、Pythonのプログラムを実行すると、順次指定されたボタンを順次押下して処理を継続していくことができます。
Worksheet上のボタン1の画像のスクリーンショット[“btn.PNG”]の座標を取得してボタンを押下するためには以下の様に行います。
1
2
3
4
5
6
7
8
9
10
|
import pyautogui as pa
# "btn.PNG":Worksheet上のボタン1の画像のスクリーンショット
# 画像認識でアドレスを取得している
p= pa.locateOnScreen("btn.PNG", confidence=0.9)
#画像認識で取得した座標をクリック
pa.click(p, button='left', clicks=2)
|
2:Python標準ライブラリ:CSV
CSVファイルの読み込みや書き込みを行うPythonの標準ライブラリです。CSVファイルの読み込みは以下の様に行います。
1
2
3
4
5
6
7
8
9
|
import csv
with open(csvファイル名, newline='', encoding = 'shift_jis') as rdcsv:
# CSVファイルの読み込み
rdline = csv.reader(rdcsv, delimiter=',', quotechar='"')
for line in rdline:
~
|
また、データを読み込んで分析を行う場合にはpandas.read_csvを使用することも可能です。
3:python-docx
PythonでWordのDocumentの処理を行う外部パッケージの一つです。Wordのファイルの読み込みは以下の様に行います。
1
2
3
4
5
6
7
8
9
|
import docx
import os.path
wdfile = os.path.abspath(".") + "/サンプル.docx"
# Word文書の読み込み
doc = docx.Document(wdfile)
~
|
4:PDFMiner.six
PythonでPDFの処理を行う外部パッケージの一つです。PDFのファイルを読み込んで含まれているテキストファイルの出力は以下の様に行います。
1
2
3
4
5
6
7
8
9
|
from pdfminer.high_level import extract_text
import os.path
pdfile = open(os.path.abspath(".") + "/Welcome.pdf", 'rb')
# 指定したPDFファイルよりテキストを抽出
text = extract_text(pdfile)
print(text)
|
- SE
- マクロよりもPythonでの処理は、圧倒的に便利ですね。
- PM
- プログラミングの負担が大幅に軽減されるので、ほぼ自動での処理が可能です。
PythonでExcelを操作してみよう
Microsoft Office等を操作するプログラムはVBAのみでコードの記述が可能な部分もありますが、Pythonを併用することにより、より効率的なコードを記述することが可能です。
ここまで述べていたライブラリには、上記で説明した以外にも様々な機能があります。まずは評価してみてはいかがでしょうか。
Search キーワード検索
Popular 人気の記事
reccomended おすすめ記事
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)