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") と言うような記述方法も可能です

01.import win32com.client
02.import traceback
03.import sys
04.import os
05. 
06.ExcelApp = win32com.client.Dispatch("Excel.Application")
07.# デバッグ時は、Excel の本体を表示させて状況が解るようにする
08.ExcelApp.Visible = True
09.# UI でチェックさせるようなダイアログを表示せずに実行する
10.ExcelApp.DisplayAlerts = False
11. 
12.try:
13.    # ****************************
14.    # ブック追加
15.    # ****************************
16.    Book = ExcelApp.Workbooks.Add()
17. 
18.    # 通常一つのシートが作成されています
19.    Sheet = Book.Worksheets( 1 )
20. 
21.    # ****************************
22.    # シート名変更
23.    # ****************************
24.    Sheet.Name = "Pythonの処理";
25. 
26.    # ****************************
27.    # セルに値を直接セット
28.    # ****************************
29.    for i in range(1, 11):
30.        Sheet.Cells(i, 1).Value = f"処理 : {i}"
31. 
32.    # ****************************
33.    # 1つのセルから
34.    # AutoFill で値をセット
35.    # ****************************
36.    Sheet.Cells(1, 2).Value = "子"
37.    # 基となるセル範囲
38.    SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2))
39.    # オートフィルの範囲(基となるセル範囲を含む )
40.    FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2))
41.    SourceRange.AutoFill(FillRange)
42. 
43.    # ****************************
44.    # 保存
45.    # ****************************
46.    Book.SaveAs( os.getcwd() + "\\sample.xlsx" )
47. 
48.except Exception:
49.    ExcelApp.Quit()
50.    traceback.print_exc()
51.    sys.exit( )
52. 
53. 
54.ExcelApp.Quit()
55.print("処理を終了します")


openpyxl で Autofill 無しの処理

01.import openpyxl
02.import traceback
03.import sys
04. 
05.try:
06.    # ****************************
07.    # 新しいブックを作成
08.    # ****************************
09.    Book = openpyxl.Workbook()
10. 
11.    # ****************************
12.    # 通常一つのシートが作成されています
13.    # ****************************
14.    Sheet = Book.worksheets[0]
15. 
16.    # ****************************
17.    # シート名変更
18.    # ****************************
19.    Sheet.title = "Pythonの処理"
20. 
21.    # ****************************
22.    # セルに値を直接セット
23.    # ****************************
24.    for i in range(1, 11):
25.        Sheet.cell(i, 1, f"処理 : {i}")
26. 
27.    Sheet.merge_cells("C1:F1")
28.    Sheet.cell(1, 3).value = "結合されたセル"
29. 
30.    Book.save('sample.xlsx')
31. 
32.except Exception:
33.    traceback.print_exc()
34.    sys.exit( )
35. 
36.print("処理を終了します")

関連する記事

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

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ
Excel, Python