CSVファイルをExcelファイルにする
Excelで「開く」を使ってダイアログに応答する代わりに、
PowerShellを使って応答なしで取り込む
そのスクリプトがこれである。説明はこちらの最終ページ
#SJIS,CRLF
#
# CSVファイルをExcelにインポートする
# Usage:. ../ps/CSV2XLSX.ps1 -incsv="a.txt" -encoding=UTF8 -delimiter='\t' -otxls="a.xlsx"
#
#引数を内部変数に取得する
$opts = @{"-encoding"="Default";"-delimiter"=',';} <# 省略可能オプションの初期値を設定する #>
if ($Args.Length -gt 0) {
$Args | ForEach-Object -process { $opts[$_.Split('=')[0]]=$_.Split('=')[1] }
}
$incsv = $opts["-incsv"]
$encoding = $opts["-encoding"]
$delimiter = $opts["-delimiter"]
$otxls = $PWD.Path + "\" + $opts["-otxls"]
# Excelを起動する
$xls = New-Object -ComObject Excel.Application
$xls.Visible = $true
# WorkBook を追加する
$wb = $xls.WorkBooks.Add()
# シートを選択する
$ws = $wb.WorkSheets[1]
$ws.name = $incsv <# シート名にCSVファイル名を設定する #>
# CSVファイルを読み込む
$csvdata= Get-Content -Path $incsv -Encoding $encoding
# 1行ずつ処理する
for($rows=0; $rows -lt $csvdata.length; $rows++) {
# 区切り文字で項目に分割する
$fields = ($csvdata[$rows]) -split $delimiter
# 1項目ずつ処理する
for($cols=0; $cols -lt $fields.length; $cols++) {
# Excelに書き込む
$ws.Cells.Item($rows+1, $cols+1).Value = $fields[$cols]
}
}
# Excelに書き込んだ部分をテーブルにする
$ws.ListObjects.Add(1, $ws.Range($ws.Cells.Item(1, 1), $ws.Cells.Item($rows, $cols)),0, 1).Name = $incsv
$ws.ListObjects($incsv).TableStyle = "TableStyleMedium2"
# 2つめ以降のシートを削除する
for($i=$wb.sheets.count;$i -gt 1;$i--){
$ws = $wb.worksheets[$i]
$ws.delete() > $null
}
# ファイルが既存の場合警告メッセージを表示しないようにする
$xls.DisplayAlerts = $false
# Excelファイルを保存する
$wb.SaveAs($otxls)
# 警告メッセージの表示を元に戻す
$xls.DisplayAlerts = $true
# WorkBookを閉じる
$wb.Close()
# Excelを終了する
$xls.Quit()
# COM参照を解放する
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($ws)
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($wb)
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($xls)