ブック作成サンプルコード


#############################################################################
#
# PowerShell X-TRAiNサンプルプログラム
# (c) ARKTAN.INC.
#
#----------------------------------------------------------------------------
# コマンドプロンプトでの実行手順
#
# @DLL axls_api.dll へのパスを通す
# 例)
# > set PATH=C:\Temp;%PATH%
#
# A以下の行の定数定義に出力、入力、テンプレートの各ブックのパスを記述
# set OUTPUT_BOOK     "C:\Temp\PowerShell出力サンプル.xlsx" -option constant
#
# B本スクリプトの起動
# > powershell -file PS_XTRAiN.ps1
#
#############################################################################
#----------------------------------------------------------------------------
# メイン
#----------------------------------------------------------------------------
# 
# 
# ブックパスはフルパスで指定する
# 
set OUTPUT_BOOK   "C:\Temp\PowerShellサンプル.xlsx"     -option constant

function Main
{
	#
	# 32bit環境チェック
	#
	if ([System.Environment]::Is64BitProcess){
		# 64 bit
		echo "本デモは64bit環境では動作しません"
		exit -1
	} else {
		# 32bit
		# echo "32bit"
	}

	# Excel新規作成
	write_book $OUTPUT_BOOK

	exit 0
}

#-------------------------------------------------------------------------------
# Excel Book作成
#-------------------------------------------------------------------------------
function write_book([String] $xls_path)
{
	$date = Get-Date -format 'yyyy/MM/dd HH:mm:ss:ff'
	$message = "処理開始 " + $date
	Write-Output $message

	# Excelブックオープン
	# 戻り値にブック用構造体アドレスが文字列として返されますので、以降の処理で使用します。
	# 処理を終了する際には、AXLS_save_book関数(保存して正常終了)またはAXLS_scrap_book関数(メモリ破棄)をCALLする必要があります。
	# AXLS_scrap_book関数をCALLしない場合はメモリリークが起こります。
	$book = AXLS_open_book
	if ($book -eq ""){
		$message = "ERROR:open_book()"

		Write-Output $message
		exit -1
	}

	# ブック名設定
	# 値や属性の設定はAXLS_put_values関数に、項目=項目値の形式の引数で指定します。
	# 空白またはタブで区切りで、複数指定することができます。
	$arguments = "BOOK=" + $xls_path

	$rtn = AXLS_put_values $book $arguments
	if ($rtn -ne 0){
		$message1 = "ERROR:AXLS_put_value() rtn=" + $rtn + " mesg="
		$message2 = AXLS_error_mesg $book
		$message = $message1 + $message2
		AXLS_scrap_book $book

		Write-Output $message
		exit -1
	}

	# 列幅設定
	$arguments = "B.幅=20 C.幅=20 D.幅=20 E.幅=20"

	$rtn = AXLS_put_values $book $arguments
	if ($rtn -ne 0){
		$message1 = "ERROR:AXLS_put_value() rtn=" + $rtn + " mesg="
		$message2 = AXLS_error_mesg $book
		$message = $message1 + $message2
		AXLS_scrap_book $book

		Write-Output $message
		exit -1
	}

	$now_date = Get-Date -format 'yyyy/MM/dd'

	$line_ct = 0
	$max_row = 100

	# 行数繰り返し
	for ($row=1; $row -le $max_row; $row++){

		# A〜E列に数値、文字、日付を設定
		$cell1 = AXLS_cell_name $book $row 1
		$cell2 = AXLS_cell_name $book $row 2
		$cell3 = AXLS_cell_name $book $row 3
		$cell4 = AXLS_cell_name $book $row 4
		$cell5 = AXLS_cell_name $book $row 5
		$line_ct++

		$arguments = $cell1 + "=" + $row + " " + $cell2 + "=日本語文字列" + $row + " " + $cell2 + ".フォント.色=赤 " + $cell3 + "=" + $now_date + " " + $cell3 + ".書式=和暦 " + $cell4 + "=ABCDEFG " + $cell4 + ".フォント.名=`"Arial Black`" " + $cell5 + "=12345 " + $cell5 + ".書式=漢数字"

		$rtn = AXLS_put_values $book $arguments
		if ($rtn -ne 0){
			$message1 = "ERROR:AXLS_put_value() rtn=" + $rtn + " mesg="
			$message2 = AXLS_error_mesg $book
			$message = $message1 + $message2
			AXLS_scrap_book $book

			Write-Output $message
			exit -1
		}

		# 偶数行を塗りつぶす
		if ($line_ct % 2 -eq 0){

			$range = AXLS_cell_range $book $row 1 $row 5
			$arguments = $range + ".塗りつぶし.色=#CCCCCC"

			$rtn = AXLS_put_values $book $arguments
			if ($rtn -ne 0){
				$message1 = "ERROR:AXLS_put_value() rtn=" + $rtn + " mesg="
				$message2 = AXLS_error_mesg $book
				$message = $message1 + $message2
				AXLS_scrap_book $book

				Write-Output $message
				exit -1
			}
		}
	}

	# 表全体に罫線を付ける
	$range = AXLS_cell_range $book 1 1 $max_row 5
	$arguments = $range + ".罫線=実線"

	$rtn = AXLS_put_values $book $arguments
	if ($rtn -ne 0){
		$message1 = "ERROR:AXLS_put_value() rtn=" + $rtn + " mesg="
		$message2 = AXLS_error_mesg $book
		$message = $message1 + $message2
		AXLS_scrap_book $book

		Write-Output $message
		exit -1
	}

	# Excelブック保存
	$rtn = AXLS_save_book $book
	if ($rtn -ne 0){
		$message1 = "ERROR:AXLS_save_book() rtn=" + $rtn + " mesg="
		$message2 = AXLS_error_mesg $book
		$message = $message1 + $message2
		AXLS_scrap_book $book

		Write-Output $message
		exit -1
	}

	$message = "Excelブック" + $xls_path + "を出力しました。"
	Write-Output $message

	$date = Get-Date -format 'yyyy/MM/dd HH:mm:ss:ff'
	$message = "処理終了 " + $date
	Write-Output $message

	return
}

#-------------------------------------------------------------------------------
# ブックオープン
#-------------------------------------------------------------------------------
function AXLS_open_book()
{
	$book = Invoke-DLL "axls_api.dll" ([String]) "open_book"

	return $book
}

#-------------------------------------------------------------------------------
# ブック保存
#-------------------------------------------------------------------------------
function AXLS_save_book([String]$book)
{
	$parameterTypes = [String]
	$parameters = $book
	$rtn = Invoke-DLL "axls_api.dll" ([Int32]) "save_book" $parameterTypes $parameters

	return $rtn
}

#-------------------------------------------------------------------------------
# ブック破棄
#-------------------------------------------------------------------------------
function AXLS_scrap_book([String]$book)
{
	$parameterTypes = [String]
	$parameters = $book
	$rtn = Invoke-DLL "axls_api.dll" ([Int32]) "scrap_book" $parameterTypes $parameters

	return $rtn
}

#-------------------------------------------------------------------------------
# セル値設定
#-------------------------------------------------------------------------------
function AXLS_put_cell([String]$book, [String]$cell, [String]$values)
{
	$parameterTypes = [String], [String], [String]
	$parameters = $book, $cell, $values

	$rtn = Invoke-DLL "axls_api.dll" ([Int32]) "put_cell" $parameterTypes $parameters

	return $rtn
}

#-------------------------------------------------------------------------------
# 値/属性設定
#-------------------------------------------------------------------------------
function AXLS_put_values([String]$book, [String]$values)
{
	$parameterTypes = [String], [String]
	$parameters = $book, $values
	$rtn = Invoke-DLL "axls_api.dll" ([Int32]) "put_values" $parameterTypes $parameters

	return $rtn
}

#-------------------------------------------------------------------------------
# シートをオープンする
#-------------------------------------------------------------------------------
function AXLS_open_sheet([String]$book, [String]$sheet_name)
{
	$parameterTypes = [String], [String]
	$parameters = $book, $sheet_name
	$rtn = Invoke-DLL "axls_api.dll" ([Int32]) "open_sheet" $parameterTypes $parameters

	return $rtn
}

#-------------------------------------------------------------------------------
# シートをインデックスでオープンする
#-------------------------------------------------------------------------------
function AXLS_open_sheet2([String]$book, [Int32]$sheet)
{
	$parameterTypes = [String], [Int32]
	$parameters = $book, $sheet
	$rtn = Invoke-DLL "axls_api.dll" ([Int32]) "open_sheet2" $parameterTypes $parameters

	return $rtn
}

#-------------------------------------------------------------------------------
# セル名取得
#-------------------------------------------------------------------------------
function AXLS_cell_name([String]$book, [Int32]$row, [Int32]$clm)
{
	$parameterTypes = [String], [Int32], [Int32]
	$parameters = $book, $row, $clm
	$cell = Invoke-DLL "axls_api.dll" ([String]) "cell_name" $parameterTypes $parameters

	return $cell
}

#-------------------------------------------------------------------------------
# セル範囲名取得
#-------------------------------------------------------------------------------
function AXLS_cell_range([String]$book, [Int32]$row1, [Int32]$clm1, [Int32]$row2, [Int32]$clm2)
{
	$parameterTypes = [String], [Int32], [Int32], [Int32], [Int32]
	$parameters = $book, $row1, $clm1, $row2, $clm2
	$range = Invoke-DLL "axls_api.dll" ([String]) "cell_range" $parameterTypes $parameters

	return $range
}

#-------------------------------------------------------------------------------
# エラーコード取得
#-------------------------------------------------------------------------------
function AXLS_error_code([String]$book)
{
	$parameterTypes = [String]
	$parameters = $book 
	$code = Invoke-DLL "axls_api.dll" ([Int32]) "error_code" $parameterTypes $parameters

	return $code
}

#-------------------------------------------------------------------------------
# エラーメッセージ取得
#-------------------------------------------------------------------------------
function AXLS_error_mesg([String]$book)
{
	$parameterTypes = [String]
	$parameters = $book 
	$message = Invoke-DLL "axls_api.dll" ([String]) "error_mesg" $parameterTypes $parameters

	return $message
}

#-------------------------------------------------------------------------------
# DLL呼び出し
#-------------------------------------------------------------------------------
function Invoke-DLL([string]$dllName, [Type]$returnType, [string]$methodName, [Type[]]$parameterTypes, [Object[]]$parameters)
{ 
	## Begin to build the dynamic assembly
	$domain = [AppDomain]::CurrentDomain
	$name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
	$assembly = $domain.DefineDynamicAssembly($name, 'Run')
	$module = $assembly.DefineDynamicModule('PInvokeModule')
	$type = $module.DefineType('PInvokeType', "Public,BeforeFieldInit")

	## Define the actual P/Invoke method
	$method = $type.DefineMethod($methodName, 'Public,HideBySig,Static,PinvokeImpl', $returnType, $parameterTypes)

	## Apply the P/Invoke constructor
	$ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string])
	$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName
	$method.SetCustomAttribute($attr)

	## Create the temporary type, and invoke the method.
	$realType = $type.CreateType()
	$realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null, $parameters)
}

. Main

	


解説
ブックオブジェクトの作成
    # Excelブックオープン
    # 戻り値にブック用構造体アドレスが文字列として返されますので、以降の処理で使用します。
    # 処理を終了する際には、AXLS_save_book関数(保存して正常終了)またはAXLS_scrap_book関数(メモリ破棄)をCALLする必要があります。
    # AXLS_scrap_book関数をCALLしない場合はメモリリークが起こります。
    $book = AXLS_open_book
    if ($book -eq ""){
        $message = "ERROR:open_book()"
 
        Write-Output $message
        exit -1
    }
	
AXLS_open_book関数を使い、ブックオブジェクトを生成します。
オブジェクトの実体は、DLL/共有ライブラリ内に確保された、X-TRAiN用構造体の アドレスを16進数に変換した文字列です。
以降の関数呼び出し時には、この値を使用します。
処理の終了時にはAXLS_save_book関数またはAXLS_scrap_book関数でメモリを解放する必要があります。
メモリを確保せきなかった場合は戻り値としてNULLが返却されますので、エラー処理では X-TRAiNの関数(AXLS〜)を呼び出さないでください。

値/属性の設定
    # 列幅設定
    $arguments = "B.幅=20 C.幅=20 D.幅=20 E.幅=20"
 
    $rtn = AXLS_put_values $book $arguments
    if ($rtn -ne 0){
        $message1 = "ERROR:AXLS_put_value() rtn=" + $rtn + " mesg="
        $message2 = AXLS_error_mesg $book
        $message = $message1 + $message2
        AXLS_scrap_book $book
 
        Write-Output $message
        exit -1
    }
 
	
AXLS_put_values関数を使い、ブック名やシート名、セルの値、各種書式の設定を行います。
設定はセル名=値 または 属性名=値 の様な文字列を羅列した形式で行います。
使用できる属性の詳細は、マニュアルを参照してください。
エラーが発生した場合は、戻り値として0以外が返却されます。
AXLS_error_mesg関数でエラーコードを、AXLS_error_mesg関数でエラーメッセージを 取得することができます。
異常終了する場合は、AXLS_scrap_book関数でメモリの解放を行ってください。
ブックの保存
    # Excelブック保存
    $rtn = AXLS_save_book $book
    if ($rtn -ne 0){
        $message1 = "ERROR:AXLS_save_book() rtn=" + $rtn + " mesg="
        $message2 = AXLS_error_mesg $book
        $message = $message1 + $message2
        AXLS_scrap_book $book
 
        Write-Output $message
        exit -1
    }
	
AXLS_save_book関数を使い、ブックの保存を行います。
ブック名を指定していない場合は、「Book1.xlsx」で保存しますが、パスはRubyの ディレクトリ下になってしまう事に注意してください。
保存が正常終了するとブックオブジェクトは解放されますので、以降はX-TRAiNの 関数(AXLS〜)を呼び出さないでください。