【PowerShell】複数のCSVファイルを1つのExcelファイルに纏める

PowerShellで
 ・複数のCSVファイルを
 ・1つのExcelファイルに纏める方法
を紹介します!

各CSVファイルに見出し行があっても、
上手いこと1つのExcelファイルに纏める方法です!

複数のCSVファイルを1つのExcelファイルに纏めた結果
複数のCSVファイルを1つのExcelファイルに纏めた結果
PR

コード

ここでは例として、
 ・デスクトップ配下のフォルダ「test」配下にある
 ・全てのCSVファイルを
 ・1つのExcelファイルへ纏める方法
を紹介します。

フォルダ「test」配下のCSVファイル(3つ)
フォルダ「test」配下のCSVファイル(3つ)
001.csv
001.csv
002.csv
002.csv
003.csv
003.csv

上記の全てのCSVファイルには「見出し行」があります。

# 対象フォルダを指定
$targetFolder = "C:\Users\user\Desktop\test"
# 出力するExcelファイルのパス
$outputExcelFile = "C:\Users\user\Desktop\mergeCsv.xlsx"
# シート名
$loadSheetName  = "csv"
# 書き出し開始セル
$startRange = "B2"
# テーブル名を指定
$tableName = "テストテーブル"
# 1ファイル目かどうかを判定するためのカウンタ変数
$fileCount = 0

$ws = New-Object -ComObject Wscript.Shell

try
{
    # 既にExcelファイルが存在したら削除
    if (Test-Path $outputExcelFile) {
        Remove-item -Force $outputExcelFile -ErrorAction Stop
    }

    # ExcelのCOMコンポーネントを取得
    $excel = New-Object -ComObject Excel.Application

    # ブックを新規作成しオブジェクトを取得
    $book = $excel.Workbooks.Add()
    # ブックの1シート目のオブジェクトを取得
    $sheet = $book.Worksheets.Item(1)
    # シート名を変更
    $sheet.name = $loadSheetName 
    # 処理したファイル数を示すカウンタ変数
    $fileCount = 0
    # 出力列(書き出し開始セルの列)
    $outputColumn = $sheet.Range($startRange).Column
    # 出力行(書き出し開始セルの行)
    $outputRow = $sheet.Range($startRange).Row

    # 読み込むファイルの形式を【2:文字列】と指定するための配列を作成
    $arrDataType = @()
    for ($i=0; $i -lt 255; $i++){
        $arrDataType += 2
    }

    # 指定フォルダ配下のcsvファイルのリストを取得
    $fileList = (Get-ChildItem $targetFolder -Filter *.csv -File -ErrorAction Stop).FullName

    # csvファイルの数だけ繰り返し
    foreach($file in $fileList){
        # カウンタ変数をカウントアップ
        $fileCount = $fileCount + 1
        # 「QueryTableオブジェクト(=クエリと接続)」を作成
        $QueryTable = $sheet.QueryTables.Add("TEXT;$file",$sheet.cells($outputRow,$outputColumn))
        # 区切り文字に「カンマ区切り」を指定
        $QueryTable.TextFileCommaDelimiter = $True
        # 文字コードに「Shift_JIS」を指定
        $QueryTable.TextFilePlatform = 932
        # 1ファイル目のみ、(1行目を含め)まるっと出力
        # 1ファイル目以外は、1行目を飛ばして1行ずつ出力
        if ($fileCount -eq 1) {  
            $QueryTable.TextFileStartRow = 1
        } else {
            $QueryTable.TextFileStartRow = 2
        }
        # 読み込むファイルの形式を指定
        $QueryTable.TextFileColumnDataTypes = $arrDataType[0..255]
        # 読み込み実行
        $QueryTable.Refresh($false)
        # 名前を指定(後続処理で削除できるようにするため)
        $QueryTable.Name = "仮テーブル"
        # 作成された「QueryTableオブジェクト(=クエリと接続)」を削除
        $QueryTable.Delete()
        # 次の出力行を取得
        $outputRow = $sheet.Cells($sheet.Rows.Count, $outputColumn).End(-4162).Row + 1
    }

    # 上記で作成されてしまう名前定義(仮テーブル)を削除
    foreach($n in $book.Names){
        If ($n.Name -Like $loadSheetName + "!" + "仮テーブル*") {
            $n.Delete()
        }
    }

    # 表をテーブル化
    $sheet.ListObjects.Add(1,$sheet.Range($startRange).CurrentRegion,0,1).Name = $tableName
    # ブックを保存
    $book.SaveAs($outputExcelFile)

    $ws.popup("複数のCSVファイルをマージして`nExcelファイルを作成しました。`n対象ファイル数:" + $fileCount)
}
catch
{
    $ws.popup("エラー : " + $PSItem)
}
finally
{
    # Excelを終了
    $excel.Quit()
    [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel) | Out-Null
}

以下を指定します。
※状況に応じて任意の値を指定してください。

・対象フォルダ(2行目)
・出力するExcelファイルのパス(4行目)
・シート名(6行目)
・書き出し開始セル(8行目)
・テーブル名(10行目)

「指定フォルダ配下のcsvファイルのリスト」を取得します(46行目)。

PR

実行結果

複数のCSVファイルを1つのExcelファイルに纏めることができました。

実行結果①
実行結果①
実行結果②
実行結果②
実行結果③
実行結果③
PR

参考

上記のコードは以下の記事を参考にして作成しました。

●CSVファイルをExcelファイルにする

タイトルとURLをコピーしました