CSVファイルをExcelに取り込むPowerShellを作ってみた | 星山のブログ

星山のブログ

スローライフ始めてみるか

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)