最終更新日 2024-09-25

「hmPy・IronPython」の例題⑥ Excelの操作

概要

IronPythonの例題のひとつとなります。

Excelの操作

.NETはExcelの操作にも向いているため、IronPythonでも非常にやりやすいと言えるでしょう

#PY = loaddll( hidemarudir + @"\hmPy.dll" );

$xls_filename = R"(C:\work\Sample.xlsx)";

#_ = dllfuncw(#PY, "DoFile", currentmacrodirectory + "\\excel1.py"); // 外部ファイルの実行
 
freedll( #PY );

外部の「.py」ファイルを用意

上記マクロと同じディレクトリに、excel1.pyというファイルを用意しましょう。
文字コードはやはりcp932(sjis)なので、気をつけてください。
又、あらかじめ、「C:\work\Sample.xlsx」というパスでExcelファイルを用意しておいてください。

# coding: cp932
import clr
clr.AddReferenceByPartialName("System.Runtime.InteropServices")
clr.AddReferenceByPartialName("System.Windows.Forms")

import System
from System import *
from System.Runtime.InteropServices import *
from System.Windows.Forms import *

filename = hm.Macro.Var["$xls_filename"]

excelApp = None
workBooks = None
workBook = None
workSheets = None
range = None

try:
    # COM経由で開く。秀丸マクロもCOM機能はもってはいるが、取り扱いが大変になりすぎる傾向がある、IronPythonならお手軽である。
    excelAppType = Type.GetTypeFromProgID('Excel.Application')
    excelApp = Activator.CreateInstance(excelAppType)
    excelApp.DisplayAlerts = False

    workBooks = excelApp.WorkBooks
    workBook = workBooks.Open(filename)
    workSheets = workBook.Sheets
    workSheet = workSheets[1]
    range = workSheet.Cells
    range[1, 1] = "テスト文字列"
    workBook.Save()
    workBook.Close()

except Exception as e:
    System.Windows.Forms.MessageBox.Show(e.Message)
    pass
else:
    pass

finally:
    # 順次解放
    if range != None:
        Marshal.ReleaseComObject(range)
    if workSheet != None:
        Marshal.ReleaseComObject(workSheet)
    if workSheets != None:
        Marshal.ReleaseComObject(workSheets)
    if workBook != None:
        Marshal.ReleaseComObject(workBook)
    if workBooks != None:
        Marshal.ReleaseComObject(workBooks)
    if excelApp != None:
        Marshal.ReleaseComObject(excelApp)