pandasでできないエクセル書式設定をopenpyxlでコピー貼り付け

※記事内に広告が含まれる場合があります。
エクセル書式をコピーして貼り付けるpython関数 テクノロジー
スポンサーリンク

Pythonでエクセルデータを加工する場合はpandasが簡単だと思っていますが書式設定ができません。

openpyxlの方が書式などの応用は効きますがコードを書くのが面倒だなと私は感じています。

そこで、必要データの書き出しはpandasを利用し、書式設定してあるエクセルを利用して書式を貼り付けることで反映させる方法ををご紹介します。

本記事を読むことで書式設定のためにわざわざ細かいコードを書く必要がなくなります。

スポンサーリンク

書式設定してあるエクセルを貼り付けるメリット

もし、まっさらなエクセルにpythonで書式設定をするならセル毎に書式設定するコードを書く必要があります。

事前に書式をコピーして貼り付けるようのエクセルを用意しておけば手作業でエクセルに書式設定ができます。

そしてその書式をコピーするpython関数を作成しておけば使いまわすことができるので毎回コードを書く手間から解放されるのがメリットです。

excelの書式をコピーするPythonコード

必要ライブラリのインポート

import openpyxl as xl

下記関数がエクセルの書式をコピーするものです。

def Format_Copy(in_path,format_path,out_path):

    #①メインデータを読み込む
    #対象のワークシートを選定 ここでは一番左のSheetを対象とする
    wb1 = xl.load_workbook(filename=in_path)
    ws1 = wb1.worksheets[0]

    #②フォーマットを読み込む(操作は①と同じ)
    wb2 = xl.load_workbook(filename=format_path)
    ws2 = wb2.worksheets[0]

    #③アウトプットファイルを①②を利用して作成
    for row in ws1.iter_row(min_row=1):
        for cell in row:

            #行ナンバー取得
            x=cell.column + 1
            #項目数を数字で取得
            y=cell.column

            ws2.cell(row = x,column=y).values=cell.value

    return wb2.save(out_path)

#実行
in_path="指定してください"
format_path="指定してください"
out_path="指定してください"
Format_Copy(in_path,format_path,out_path)

in_path,format_path,out_pathにpathを入れて実行すると書式がコピーされます。

エクセル書式コピー関数の解説

書式コピーの考え方

①データがあるエクセルファイルと②書式の記載があるエクセルファイルを用意して、①と②をあわせて③アウトプットファイルを作成します。

エクセルBOOKのSheetを指定する

エクセルは複数Sheetある場合があります。どのsheetを対象とするか指定する必要があります。本記事の参考例ではエクセルBOOKの一番左にあるsheetをwb1.worksheets[0]で指定しています。

    #①メインデータを読み込む
    #対象のワークシートを選定 ここでは一番左のSheetを対象とする
    wb1 = xl.load_workbook(filename=in_path)
    ws1 = wb1.worksheets[0]

どこからコピーするかを指定する

2つのエクセルファイルからセル値を指定してコピーするのでどこから書き込むかを指定する必要があります。

下記コードのmin_row=1を指定やcell.column + 1が該当部分です。この数値を編集してアウトプットファイルを確認するとイメージをつかみやすいと思います。

    #③アウトプットファイルを①②を利用して作成
    for row in ws1.iter_row(min_row=1):
        for cell in row:

            #行ナンバー取得
            x=cell.column + 1

openpyxlでVBAファイルを残す対応

コピーするデータにVBAが含まれている場合はVBAファイルを残す処理を記述する必要があります。

#VBAなし
wb1 = xl.load_workbook(filename=in_path)

#VBAを残す
wb1 = xl.load_workbook(filename=in_path,keep_vba=True)

最後に

Format_Copy(in_path,format_path,out_path)関数を利用すれば毎回書式をコピーするコード記述が不要になります。

コピーしたい書式ファイルをformat_pathに指定しておけばよくなるので楽だと思います。

この方法であればデータ加工をpandasで行い必要部分だけこの関数を使えばよいのでご利用いただければと思います。

最後に私がPythonの勉強をして入門者から中級者までにこの本1冊あれば習得できるおすすめ本記事も書いております【本1冊で】Python入門から中級までなれるおすすめ本ご興味がある方は御覧くださいませ。

タイトルとURLをコピーしました