Excelのブックをシート別に分割するpythonスクリプト

Pythonの練習がてら、Excelのブックをシート別に分割するものをつくってみました。
送るメニューに追加して使えるように、バッチファイルも記載しています。

一つのブックの中に複数世代の情報を並べて作ったけど
何処をいじったのか確認するのが大変。。というときに
分割したものをWinMergeにかければチェックが楽にできます。

# ブックを分割するpythonコード

やっていることは、シートを開いて値と書式をコピーするだけです。
ブックを跨ったシートコピーはopenpyxlではできなかったので
出来上がりとしては劣化コピー的なものになりますが
WinMerge等でdiffを取りたいだけだったらこれで十分だと思います。

```python:splitsheet.py
import openpyxl
from openpyxl.styles import Font

# ------------------------------------------------
# 引数処理
# 引数にエクセルファイルを渡していないと終了
# ------------------------------------------------

# 引数1つ目をファイル名として受け取る
import sys

##
## 引数の数で判定
##

# 引数指定されていない場合は終了
if len(sys.argv) != 2 :
    print("Excelファイルを1つ指定してください")
    quit()

filepath = sys.argv[1]

##
## ファイル名で判定
##

# ファイル名から拡張子なしの部分を抽出
import os

# 拡張子あり
basename = os.path.basename(filepath)

# 拡張子なし
basename_without_ext = os.path.splitext(basename)[0]

# 拡張子のみ
basename_ext = os.path.splitext(basename)[1]

# ファイル名を表示
print("ファイルパス：" + filepath)
print("ファイル名(拡張子あり)：" + basename)
print("ファイル名(拡張子なし)：" + basename_without_ext)

if not "xls" in basename_ext:
    print("指定したファイルの拡張子がxlsを含んでいません")
    quit()

# ------------------------------------------------
# ファイル分割
# ------------------------------------------------

# ブックを開く
wb_src = openpyxl.load_workbook(filepath)

# シートを取得
sheets = wb_src.sheetnames

# シート名を表示(デバッグ用)
print(sheets)

# シートを一つずつ開いてセルをコピー
# フォントはコピーできないから捨てる
for ws_src in wb_src:
    print(ws_src.title)

    # 新しいブックを創る
    wb_dst = openpyxl.Workbook()

    # 別ブックにシートをコピーはできないらしい
    # wb_dst.copy_worksheet(ws_src)
    
    # 新しいシートに内容を全部コピーする
    ws_dst = wb_dst.worksheets[0]

    # 1セルずつパターン
    for row in ws_src:
        for cell in row:
            cell_dst = ws_dst[cell.coordinate]
            # coordinate は 座標(A5等)の意味
            cell_dst.value = cell.value
            cell_dst.number_format = cell.number_format
            
            # フォント情報はコピーできなかった
            # boldとかitalicとか複数要素のオブジェクトになっていそう
            #ws_dst[cell.coordinate].font = cell.font
    
    # まとめて実行パターン　⇒　やろうと思ったけど挫折
    """
    for row in ws_src.rows:
        adrs = []
        for cell in row:
            adrs.append(cell.coordinate)

            # coordinate は 座標(A5等)の意味
            ws_dst[join(adrs)].value = row.value
            ws_dst[join(adrs)].number_format = row.number_format
    """  

    # 保存する
    wb_dst.save(basename_without_ext + "_" + ws_src.title + ".xlsx")


```


# 送るメニューで起動できるようにする

RelaxToolsAddin等でブックを分割する機能もあるのですが
沢山あるとイチイチブックを開くのすらめんどくさいので
右クリックで分割できるようにします。

事前設定が必要な部分をファイル配布のたびに説明するのが面倒なので
バッチファイルのコメント文としてあらかじめ記載しています。

格納先のフォルダは各自で適宜編集して使ってください。


```bat:Excelをシート別に分割
:: 事前に以下を実施して、.pyをpythonに関連付けて開けるようにしておきましょう
:: 参考にさせていただいたサイト
:: 
:: いつも隣にITのお仕事
:: https://tonari-it.com/python-file-double-click-run/
:: 
:: ------------------------------------------------
:: ◆Anacondaでは拡張子「.py」のファイルの関連付けがされない
::   PythonのインストールをPython公式ディストリビューションで
::   行ったのであれば拡張子が「.py」のpyファイルはダブルクリック
::   で実行をすることができます。
::   Anacondaを使った人は以降の手順で設定しましょう。
:: ------------------------------------------------
::
:: １．Anaconda Promptを管理者モードで起動する
:: ２．拡張子とファイルタイプの関連付け
::   ２－１．関連付け状態確認
::     実行：assoc | findstr py
::     確認：何も表示されないこと
:: 　２－２．関連付け
::     実行：assoc .py=Python.File
::     確認：.py=Python.File
::   ２－３．関連付け状態確認
::     実行：assoc | findstr py
::     確認：.py=Python.File
:: ３．ftypeコマンドでファイルタイプとアプリケーションの関連付け
::   ３－１：関連付け状態確認
::     実行：ftype | findstr py
::     確認：何も表示されないこと
::   ３－２：関連付け
::     実行：ftype Python.File="C:\Users\ユーザー名\Anaconda3\python.exe" "%1" %*
::     確認：Python.File=”C:\Users\ユーザー名\Anaconda3\python.exe” “%1” %*
::   ３－３：関連付け状態確認
::     実行：ftype | findstr py
::     確認：Python.File=”C:\Users\ユーザー名\Anaconda3\python.exe” “%1” %*
:: ４．確認
::     以下のような適当なスクリプトを作って、ダブルクリックして確認
::       ▼runtest.py
::         print("Hello Python!")
::         input()
::
:: 引数の渡し方とかは別途splitsheet.pyを見てください。
:: バッチファイルは、エクスプローラのアドレス欄に「sendto」と入れて開くフォルダに放り込めばOKです。

echo %*

C:\Users\ユーザ名\格納先フォルダ\splitsheet.py %*

pause
````