#背景・目的
Excelファイルにある各シート別ファイルとして分割したいという依頼を受けました。本来はVBA案件かと思うのですが、Excelファイルをわざわざ開いてマクロを起動するのも面倒。というか、そもそもVBAが書きたくない。
というわけで、Excelファイルを右クリックして、各シート毎のファイルに分割するツールをPythonで作ってみたいと思います。
#外部ライブラリのインストール
Excelを操作するためのライブラリと、ファイルのパス作成のためのライブラリが必要になります。標準では無いので、事前にインストールしておきます。
$ pip install win32com.client
$ pip install pathlib
$ pip install openpyxl
#コード
import os
import glob
import win32com.client
import pathlib
import openpyxl
import sys
excel_dir = pathlib.Path(sys.argv[1]).parent #対象のExcelファイルが保存されているフォルダのパス
input_file = str(sys.argv[1]) #Excelファイルのパスを文字列に変換
#シートの一覧取得 (openpyxlを利用)
book = openpyxl.load_workbook(input_file)
sheets_list = book.sheetnames
for i in range(len(sheets_list)):
# Excelを起動する
app = win32com.client.Dispatch("Excel.Application")
app.Visible = False
app.DisplayAlerts = False
# Excelでワークブックを読み込む
sheet_no = i + 1 #excelのシートは1スタートのため1を足す
book = app.Workbooks.Open(input_file)
book.WorkSheets(sheet_no).Activate()
new_book = app.Workbooks.Add()
# 各シート毎に保存
new_file = sheets_list[i] + '.xlsx'
path_obj = pathlib.Path(excel_dir, new_file) #パスオブジェクトに変換
output_file = path_obj.resolve() #絶対パスに変換
book.Worksheets(sheet_no).Copy(Before=new_book.Worksheets(1)) #新しいExcelファイルに指定シートをコピー
new_book.SaveAs(str(output_file)) #ファイル保存
# Excelを終了
app.Quit()
#batファイルの作成
pyファイルはsendtoフォルダに置いてもキックされません。
作成したexcel_split.pyをキックするためにbatファイルを作ります。※PowerShellでも良いです。
python \\Pythonファイルの保存先\excel_split.py
#Sendtoフォルダに保存
作成したbatファイルをsendtoフォルダに保存します。
sendtoフォルダは[Win]キーと[R]キー同時押しして、検索ボックスに「shell:sendto」と入れれば表示されます。
#利用方法
Excelファイルを右クリック→送る→excel_split.batをクリックするとそのExcelファイルにある各シート毎のファイルが作成されます。
補足:EXE化してユーザーへ配布したい場合
ユーザーに配布する場合は、EXE化したものを同じくsendtoフォルダに置いてあげればbatファイル不要で起動出来ます。以下の記事でEXE化の方法を紹介しています。