PythonでEXCELテンプレート帳票を作成して印刷するには?
業務プログラムを作成時にはEXCELテンプレートを作成して値を挿入し印刷したい場合があります。
本記事では、PythonでEXCELを操作して印刷する方法を紹介します。
※pywin32を利用していますのでWindowsのみ利用可能です。
事前準備
サンプルコード実行用にchingin_template.xlsxファイルを以下からダウンロードします。
ダウンロード後は以下の図のようにCドライブにtestexcelというフォルダを作成し、その中にファイルをコピーしてください。
EXCELテンプレートへの値挿入サンプルコード
次に、EXCELテンプレートへの値挿入サンプルコードを紹介します。
#pip install --upgrade openpyxl
from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Border, Side
#pip install --upgrade pywin32
import win32com.client
import time
# EXCELに代入する変数。
sakuseidate = '令和6年1月5日'
syainname = 'かめ 脱走中'
genkou = 456200
henkou = 461300
tekiyoukaisidate = '令和6年4月'
syaincd = '1999101'
# ワークブックを開いて 'chingin' シートを選択
workbook = load_workbook(filename='c:\\testexcel\\chingin_template.xlsx')
sheet = workbook['chingin']
# 値の書き込み
sheet['G5'] = sakuseidate
sheet['A7'] = syainname
sheet['F22'] = genkou
sheet['F27'] = henkou
sheet['F33'] = tekiyoukaisidate
# 罫線のスタイルを定義
bottom_border = Border(bottom=Side(style='thin'))
gray_fill = PatternFill(start_color="CCCCCC", end_color="CCCCCC", fill_type = "solid")
# 罫線とグレーの網掛けを適用
sheet['A7'].border = bottom_border
sheet['B7'].border = bottom_border
sheet['F22'].fill = gray_fill
sheet['F27'].fill = gray_fill
# ファイルパス
file_path = 'c:\\testexcel\\chingin_' + syaincd + '.xlsx'
# ワークブックを社員番号付きで保存
workbook.save(file_path)
# Excel アプリケーションを起動
excel = win32com.client.Dispatch("Excel.Application")
# Excel を画面に表示
excel.Visible = True
# ワークブックを開く
workbook = excel.Workbooks.Open(file_path)
# 5秒WAIT
time.sleep(5)
# ワークブックを閉じる
workbook.Close(False)
# Excelを閉じる
excel.Quit()
サンプルを実行する前に
openpyxlとpywin32のインストールが必要ですのでインストールしていない場合には対応してください。
pip install --upgrade openpyxl
pip install --upgrade pywin32
実行結果
左図のEXCELテンプレートを利用して、新たに右図のchingin_社員番号.xlsxファイルが作成されます。
※テンプレートに画像や図形があると消えてしまうので、設計時に注意してください。
EXCELを印刷する関数
次に、EXCELファイルを印刷する関数を紹介します。
import win32print
import win32com.client
def print_excel_file(file_path, printer_name, sheet_name=None):
"""
EXCELファイルを開いて印刷する。
Windowsのみで利用できます。
Args:
file_path: 印刷する Excel ファイルのパス。
printer_name: 使用するプリンタの名前。システムにインストールされているプリンタの名前と一致している必要があります。
sheet_name: 印刷するシートの名前(オプション)。この引数が指定されていない場合、ワークブック内のすべてのシートが印刷されます。文字列で指定します。
"""
# Excel アプリケーションを起動
excel = win32com.client.Dispatch("Excel.Application")
# ワークブックを開く
workbook = excel.Workbooks.Open(file_path)
# 現在のデフォルトプリンタを取得
current_printer = win32print.GetDefaultPrinter()
# デフォルトプリンタを目的のプリンタに変更
win32print.SetDefaultPrinter(printer_name)
# 印刷実行
if sheet_name:
# 特定のシートを印刷
workbook.Sheets(sheet_name).PrintOut()
else:
# シート名が指定されていない場合、全てのシートを印刷
workbook.PrintOut()
# デフォルトプリンタを元に戻す
win32print.SetDefaultPrinter(current_printer)
# ワークブックを閉じる (保存せずに閉じる場合は False を指定)
workbook.Close(False)
# Excel アプリケーションを閉じる
excel.Quit()
# 関数の使用例
if __name__ == "__main__":
printer_name = 'Microsoft Print to PDF'
print_excel_file('c:\\testexcel\\chingin_1999101.xlsx', printer_name, 'chingin')
# シート名を指定しない場合(すべてのシートを印刷):
print_excel_file('c:\\testexcel\\chingin_1999101.xlsx', printer_name)
この例ではデフォルトプリンタを’Microsoft Print to PDF’に変更して印刷処理を行い、印刷後はデフォルトプリンタを元のプリンタに戻す処理を行っています。
最後に
以上がPythonでEXCELテンプレート帳票を作成して印刷する方法です。
SQLiteやMySQLデータベースを参照してEXCELを一括作成したり業務効率化が図れますので試してみてはいかがでしょうか。
SQLiteやMySQLの読み込み方も記事にしていますので、興味のある方はこちらを参照ください。
コメント