「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)