2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pywin32でExcelを操作してみる

Last updated at Posted at 2021-06-02

目的

pywin32+Excelの調べものついでに少しだけ触って気がついたことをメモっておく
python 3.13.0 で試したところ以下の記載では動かないので(python 3.12系でも同じ)
修正版 python 3.13+pywin32でExcelを操作してみる を参照してください

気が付いたこと

軽く検索したときに

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")

を見て以下を連想したんだけど

Dim myExcel As Object
Set myExcel = CreateObject("Excel.Application")

つまるところはそういうことなんですね
Object受けと同様なのでIntelliSenseが効かないのが残念!
Listが普通に使えるのはやはりうれしい

パッケージの追加

Installation より


PS C:\> python -m pip install --upgrade pywin32
Collecting pywin32
  Downloading pywin32-307-cp313-cp313-win_amd64.whl.metadata (8.3 kB)
Downloading pywin32-307-cp313-cp313-win_amd64.whl (6.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 592.6 kB/s eta 0:00:00
Installing collected packages: pywin32
Successfully installed pywin32-307

サンプルコード

VBAでCSVファイルを取り込んでWorksheetに書き込んでいるコードを書き直してみる
・対象データは郵便番号検索の17ISHIKA.CSV
・コメントにもあるように、VBAで使用する定数はオブジェクトブラウザで確認できるようにExcel.Constantsに定義されている

from win32com.client import constants as xlc

 の宣言により xlc.定数名で使用可能となる
・csv.readerで取り込んだ結果をそのままws.Range.Valueで書き込めるのは楽
※VBAだとRangeにVariantの配列に代入したデータを書き込む感じ
・よく使う機能以外(Worksheetの書式とかグラフの作成等)はマクロの記録で生成されたコードを修正することが多いから、定数の前に xlc. を追加することはひと手間だけど数が多いとなんとも言いがたい
※VBAのコード見慣れている人には、あまり違和感がない気がする

# coding:utf-8
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode

import win32com.client
# 定数はExcel.Constantsに定義されている
from win32com.client import constants as xlc
import os.path
import csv

xlfile = os.path.abspath(".") +  "/samp.xlsx"
csvfile =  os.path.abspath(".") + "/17ISHIKA.CSV"
addsheet = "KENCODE"

xl = win32com.client.Dispatch("Excel.Application")

xl.Visible = True

#ブックを開く
wb = xl.Workbooks.Open(xlfile)

# Worksheetの一覧を作成
lstws = []
for sh in wb.Worksheets:
    lstws.insert(len(lstws), sh.Name)

# Worksheet一覧の表示
print(lstws)

# シート名[KENCODE]が存在すれば削除する
if addsheet in lstws:
    xl.Application.DisplayAlerts = False
    wb.Worksheets(addsheet).Delete()
    xl.Application.DisplayAlerts = True

# ワークシートを追加後に名前を[KENCODE]とする
wb.Worksheets.Add()
xl.ActiveSheet.Name = addsheet
ws = wb.Worksheets(addsheet)

# 書式を先に付けた後にデータを貼り付ける
ws.Columns("A:Q").NumberFormatLocal = "@"
ws.Columns("A:Q").HorizontalAlignment = xlc.xlLeft
ws.Range("A1").Select()

rows = 1
with open(csvfile, newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for line in spamreader:
        rows = rows + 1
        # 書き込み対象Range単位で書式を付けても構わない
        # 事前に定義してある領域からの書式のコピペはよくある(帳票用とか)
        # ws.Range(ws.Cells(rows, 1), ws.Cells(rows, 15)).NumberFormatLocal = "@"
        # ws.Range(ws.Cells(rows, 1), ws.Cells(rows, 15)).HorizontalAlignment = xlc.xlLeft
        ws.Range(ws.Cells(rows, 2), ws.Cells(rows, 16)).Value = line

# 以下の確認用にB2からWorksheetに記述している
print(ws.Range("B1").End(xlc.xlDown).Row)
print(ws.Range("B" + str(ws.Rows.Count)).End(xlc.xlUp).Row)
print(ws.Range("B3").End(xlc.xlToLeft).Column)
print(ws.Range("B3").End(xlc.xlToRight).Column)

# 保存する場合
# xl.Save()

# 今回は何もしない
xl.Quit()

参考にしたのは以下のサイト

Python for Windows Extensions
mhammond/pywin32
Python pywin32(win32com) Excel 操作備忘録
PythonからExcelをwin32comで操作する
第24回.エクセルを操作する(pywin32:win32com)
Excelを起動する(オートメーション)|Access VBA

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?