PythonのOpenPyXL利用でエクセル書式を残し書き出す

PythonのOpenPyXL利用でエクセル書式を残し書き出す

Pythonでエクセル加工するライブラリといえば「Pandas、OpenPyXL」です。Pandasはコード記述が楽な反面、読み込んだエクセルの書式を記憶することができないのが残念なところ。それならPandasで書き出したデータをOpenPyXLで書式設定してあげればよい。しかも簡単に色々応用できるパターンで。

本記事では、「①元データ」とは別に、「②書き出したい書式設定されたフォーマットエクセル」に書き出す手法を選択することで解決します。この方法を利用すれば応用範囲が広く様々な自動化への転用が可能です。一部エクセルのプルダウン機能についてはOpenPyXLで読み込むことができず外れてしまうので、その場合のコーディングについても解説いたします。

目次

OpenPyXLでExcelの書式をコピーするコード

ライブラリのインストール

pip install openpyxl

インストールできない場合はPythonでpip installが使えない時のプロキシとSSL無視の記事で対策案をご紹介しております。

エクセル書式コピー関数

import openpyxl as xl

def copy_workbook(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="指定してください"

#実行
copy_workbook(in_path,format_path,out_path)

copy_workbook関数をループ文で回せば大量データをフォーマット形式に書き出すことが可能です。

プルダウンの入力規則を反映させる

プルダウン設定はopenpyxlに読み込んだ時点で消えてしまいます。プルダウン設定はコーディングの必要があるので例を下記に記載します。

①指定入力規則にたいして対象範囲を指定するコード

dv =  DataValidation(type='list',formula1='入力規則$A$2:$A$10',allow_blank=True)
dv.add('E3:E100')
ws2.add_data_validation(dv)

②入力文字制限の設定

dv =  DataValidation(type='textLength',operator='lessThanOrEqual',formula1=100,error="100文字以上はエラー")
dv.add('E3:E100')
ws2.add_data_validation(dv)

③日付制御

dv =  DataValidation(type='date',operator='greaterThan',formula1='200/1/1',error="yyyy/mm/dd入力")
dv.add('E3:E100')
ws2.add_data_validation(dv)

④自分好みにカスタム

dv =  DataValidation(type='custom',formula1='条件式',error="条件以外はアラート")
dv.add('E3:E100')
ws2.add_data_validation(dv)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

著者:ブロガー2つ(につ)

■サイト設立目的
人海戦術の時代からテクノロジー活用による自動化促進の時代に変化。テクノロジー活用を促進するための情報共有やテクノロジー支援を行います。

目次