IronPythonの例題のひとつとなります。
.NETはExcelの操作にも向いているため、IronPythonでも非常にやりやすいと言えるでしょう
#PY = loaddll( hidemarudir + @"\hmPy.dll" ); $xls_filename = R"(C:\work\Sample.xlsx)"; #_ = dllfuncw(#PY, "DoFile", currentmacrodirectory + "\\excel1.py"); // 外部ファイルの実行 freedll( #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)