himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

PowerShell から Excel を操作して Workbook を Unicode text として保存するスクリプト

このスクリプトは、chooseExcelFileで選択したExcelWorkbookと同じフォルダにある全てのExcelWorkbookをUnicode textファイルに変換する。
xls2UnicodeTxt と chooseExcelFile は .psm1 としてそのうちモジュール化したい。

# toolXls2UnicodeTxt.ps1

# handling for Excel Workbook
function xls2UnicodeTxt{
    param( $xlsW, $xlsU )
    # Excel の機能を参照 :: Excel File を参照するための御膳立て
    $oXl = New-Object -ComObject Excel.Application
    # File 選択 Dialog で選択されたワークブックを開く
    $oBk = $oXl.Workbooks.Open( $xlsW )
    # 単一ワークシートのワークブックを想定している
    $oSh = $oBk.sheets.item(1)
    # SaveAs で確認Dialog が開かないようにする
    $oXl.displayAlerts = $false
    # Excel 定数 xlUnicodeText : 42 / CSV を指定するときはこちら xlCSV : 6 
    $oBk.SaveAs( $xlsU, 42 )
    $oBk.Close()
    $oXl.quit()
    [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($oXl) | Out-Null
}

# choose of ExcelWorkbook
# File 選択 Dialog が開き(ShowDialog) "OK" ボタンが押された場合:選択された filePath、そうでない場合:nullstring が返る
$chooseExcelFile = {
    # Sytem.Windows.Forms 参照 :: File 選択 Dialog の御膳立て
    Add-Type -Assembly System.Windows.Forms
    # File 選択 Dialog を参照
    $dlg = New-Object System.Windows.Forms.OpenFileDialog
    $dlg.Filter = "Excel(*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm"
    $dlg.InitialDirectory = "."
    $dlg.Title = "ファイル選択"
    return $( if($dlg.ShowDialog() -eq "OK"){ $dlg.FileNames }else{ "" } )	
}

$ScriptBase = Split-Path ( & { $myInvocation.ScriptName } ) -parent
pushd $ScriptBase

$choosePath = &$chooseExcelFile
$chooseParent = split-path $choosePath -parent
gci $chooseParent | ? { $_.name -match ".xls" } | % {
    $srcPath = join-path $chooseParent $_.name; $srcPath
    $dstPath = join-path $chooseParent $([regex]::replace($_.name,".xls.$|.xls$",".txt")); # $dstPath
    xls2UnicodeTxt -xlsW $srcPath -xlsU $dstPath
}
popd