Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



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 pywin32

pywin32 は、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 プロパティ
Excel, Python