pywin32 の利用
Python で Excel を扱うパッケージは openpyxl ですが、Excel の仕様に合わせてファイルを作成しているだけなので、Autofill が利用できません。そこで、ここでは pywin32 を使用して Excel.Application を直接操作します( 実行する PC は Windows で Excel がインストールされている必要があります )。その前に pip そのものの更新確認
python -m pip install --upgrade pip先日 pip からアップグレードしようとしたら、見事にバグって pip が無くなってしまいました。その場合は https://bootstrap.pypa.io/get-pip.py から get-pip.py をダウンロードして python get-pip.py を実行します。
それ以降、python から アップグレードするようにしています。
pywin32 のインストール
pip install pywin32pywin32 は、Windows の COM を処理する為のブリッジです。ですから、Excel.Application に限らず 以下のようなクラスを利用できるようになります。
✅ ADODB.Connection
✅ ADODB.Recordset
✅ ADODB.Stream
✅ WScript.Shell
✅ Shell.Application
✅ Scripting.FileSystemObject
✅ Msxml2.ServerXMLHTTP
✅ CDO.Message
✅ Scripting.Dictionary▼ pip list
excel-autofill.py
Autofill する為に範囲を選択していますが、Sheet.Cells(1, 2) のように数字で全て表現できるようにしています。これはプログラミングを容易にする事が目的ですが、視認しやすいように Range("A1:A2") と言うような記述方法も可能です
import win32com.client import traceback import sys import os ExcelApp = win32com.client.Dispatch("Excel.Application") # デバッグ時は、Excel の本体を表示させて状況が解るようにする ExcelApp.Visible = True # UI でチェックさせるようなダイアログを表示せずに実行する ExcelApp.DisplayAlerts = False try: # **************************** # ブック追加 # **************************** Book = ExcelApp.Workbooks.Add() # 通常一つのシートが作成されています Sheet = Book.Worksheets( 1 ) # **************************** # シート名変更 # **************************** Sheet.Name = "Pythonの処理"; # **************************** # セルに値を直接セット # **************************** for i in range(1, 11): Sheet.Cells(i, 1).Value = f"処理 : {i}" # **************************** # 1つのセルから # AutoFill で値をセット # **************************** Sheet.Cells(1, 2).Value = "子" # 基となるセル範囲 SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2)) # オートフィルの範囲(基となるセル範囲を含む ) FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2)) SourceRange.AutoFill(FillRange) # **************************** # 保存 # **************************** Book.SaveAs( os.getcwd() + "\\sample.xlsx" ) except Exception: ExcelApp.Quit() traceback.print_exc() sys.exit( ) ExcelApp.Quit() print("処理を終了します")openpyxl で Autofill 無しの処理
import openpyxl import traceback import sys try: # **************************** # 新しいブックを作成 # **************************** Book = openpyxl.Workbook() # **************************** # 通常一つのシートが作成されています # **************************** Sheet = Book.worksheets[0] # **************************** # シート名変更 # **************************** Sheet.title = "Pythonの処理" # **************************** # セルに値を直接セット # **************************** for i in range(1, 11): Sheet.cell(i, 1, f"処理 : {i}") Sheet.merge_cells("C1:F1") Sheet.cell(1, 3).value = "結合されたセル" Book.save('sample.xlsx') except Exception: traceback.print_exc() sys.exit( ) print("処理を終了します")関連する記事
JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する関連する Microsoft ドキュメント
Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ
Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
|