2016年12月26日月曜日

LibreOffice(calc) のマクロでAMI一覧を作る


下記の記事で、aws-cli で取得したJSONデータを、LibreOffice(calc)に読み込むことができました。

ここでは、Basicマクロでヘッダと罫線を作成してAMI一覧を完成させます。

LibreOffice(calc)のBasicマクロからPythonマクロを実行する」で作成したマクロを修正して、以下のようにします。

REM  *****  BASIC  *****

Sub Main

    ' JSONデータ入力. Pythonマクロ(TestScript.py の amiList)を実行
    Dim a(0),b(0),c(0) As Variant
    scpr = ThisComponent.getScriptProvider
    scmod = scpr.getScript("vnd.sun.star.script:TestScript.py$amiList?language=Python&location=user")
    ret = scmod.invoke(a,b,c)
    
    'ヘッダ
    Dim oDoc as Object, oSheet as Object
    oDoc = ThisComponent
    oSheet = oDoc.CurrentController.ActiveSheet
    oSheet.getCellRangeByName("A1").String = "入力位置"
    oSheet.getCellRangeByName("B1").String = "VirtualizationType"
    oSheet.getCellRangeByName("C1").String = "Name"
    oSheet.getCellRangeByName("D1").String = "Hypervisor"
    oSheet.getCellRangeByName("E1").String = "ImageId"
    oSheet.getCellRangeByName("F1").String = "RootDeviceType"
    oSheet.getCellRangeByName("G1").String = "Architecture"
    oSheet.getCellRangeByName("H1").String = "[RootDevice]" & Chr$(10) & "Name"
    oSheet.getCellRangeByName("I1").String = "[RootDevice]" & Chr$(10) & "DeleteOnTermination"
    oSheet.getCellRangeByName("J1").String = "[RootDevice]" & Chr$(10) & "VolumeSize"
    oSheet.getCellRangeByName("K1").String = "[RootDevice]" & Chr$(10) & "VolumeType"
    oSheet.getCellRangeByName("L1").String = "[RootDevice]" & Chr$(10) & "Encrypted"

    ' ヘッダ属性
    oSheet.getCellRangeByName("A1:L1").CellBackColor = RGB(0, 0, 100)
    oSheet.getCellRangeByName("A1:L1").CharColor = RGB(255, 255, 255)
    oSheet.getCellRangeByName("A1:L1").VertJustify = com.sun.star.table.CellVertJustify.TOP

    ' セル高さ&幅の最適化
    oSheet.getRows.OptimalHeight = True
    oSheet.getColumns.OptimalWidth = True

    '最終行
    Dim oCursor as Object
    Dim oRange As Object
    Dim oEndRow as Long
    oRange = oSheet.getCellRangeByName("A2")
    oCursor = oSheet.createCursorByRange(oRange)
    oCursor.gotoEndOfUsedArea(True)
    oEndRow  =  oCursor.Rows.Count + 1
    'msgbox(oEndRow,0,"最終行取得")
   
    '罫線
    Dim oCtrl as Object
    Dim oSelRange as Object, oCellRange as Object
    Dim oBorder1 as Object, oBorder2 as Object, oBorder3 as Object, oBorder4 as Object
    oCtrl = oDoc.getCurrentController()
    oSelRange = oCtrl.getActiveSheet().getCellRangeByName("A1:L" & oEndRow) 
    oCtrl.select( oSelRange )
    '
    oCellRange = oDoc.CurrentSelection(0)
    ' Border1 Property
    oBorder1 = CreateUnoStruct("com.sun.star.table.BorderLine2")
    oBorder1.Color = RGB(0, 0, 0)
    oBorder1.LineWidth = 1
    oBorder1.LineStyle = 2  
    ' Border2 Property
    oBorder2 = CreateUnoStruct("com.sun.star.table.BorderLine2")
    oBorder2.Color = RGB(0, 0, 0)
    oBorder2.LineWidth = 1
    oBorder2.LineStyle = 2
    ' Border3 Property
    oBorder3 = CreateUnoStruct("com.sun.star.table.BorderLine2")
    oBorder3.Color = RGB(0, 0, 0)
    oBorder3.LineWidth = 1
    oBorder3.LineStyle = 2
    ' Border4 Property
    oBorder4 = CreateUnoStruct("com.sun.star.table.BorderLine2")
    oBorder4.Color = RGB(0, 0, 0)
    oBorder4.LineWidth = 1
    oBorder4.LineStyle = 2
    ' Set Border
    oCellRange.BottomBorder = oBorder1
    oCellRange.TopBorder = oBorder2
    oCellRange.LeftBorder = oBorder3
    oCellRange.RightBorder = oBorder4
    '
    oSelRange = oCtrl.getActiveSheet().getCellRangeByName( "A1" ) 
    oCtrl.select( oSelRange )

End Sub


このマクロを実行すると、JSONデータを入力して、以下のようなAMI一覧が作成されます。