ブック作成サンプルコード
#############################################################################
#
# 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〜)を呼び出さないでください。