powershell

powershellでcsvをエクセルファイル化

EPPlus .NET ライブラリを使う方法と、ImportExcel(Powershellモジュール)を使う方法があるようですが今回はImportExcel(Powershellモジュール)を利用します。前提条件として以下スクリプトはPowerShell 7.xを前提とします。

ImportExcelモジュールのダウンロード

今回なるべく既存環境を触りたくなかったので、専用のフォルダを作成しここにモジュールをダウンロードし利用の際都度パスを通して使う事にします。

Save-Module -Name ImportExcel -Path C:\powershell-pj\pj1\modules
利用の際はImportExcelモジュールをパスに通す
$env:PSModulePath = "C:\powershell-pj\pj1\modules;" + $env:PSModulePath  
utf-8のCSVファイルをエクセルファイル化
# UTF-8で作成したcsvファイルを用意
$csvPath = "C:\powershell-pj\pj1\test_utf8.csv"

# 作成するエクセルファイル
$excelPath = "C:\powershell-pj\pj1\test_output.xlsx"

# CSV をインポートし、すべての値を「文字列化」
$csvData = Import-Csv -Path $csvPath | ForEach-Object {
    $row = $_ | Select-Object *
    foreach ($prop in $row.PSObject.Properties) {
        $prop.Value = "$($prop.Value)"  # 全データを明示的に文字列化
    }
    $row
}

# 文字列として扱うために `-NumberFormat` を "@" に設定
$csvData | Export-Excel -Path $excelPath -WorksheetName "importdata" -NumberFormat "@"
Shift_JISのCSVファイルをエクセルファイル化
# CSVファイルのパス(Shift_JIS)
$csvPath = "C:\powershell-pj\pj1\test_sjis.csv"
# 出力するExcelファイルのパス
$excelPath = "C:\powershell-pj\pj1\test_output.xlsx"

# Shift_JIS で StreamReader を使って先頭101行(ヘッダ+100行)だけ読み込む
$encoding = [System.Text.Encoding]::GetEncoding("shift_jis")
$reader = [System.IO.StreamReader]::new($csvPath, $encoding)

# 最初の101行(0番目:ヘッダ, 1〜100番目:データ)
$lines = @()
for ($i = 0; $i -lt 101 -and !$reader.EndOfStream; $i++) {
    $lines += $reader.ReadLine()
}
$reader.Close()

# 行が不足していた場合は終了
if ($lines.Count -lt 2) {
    Write-Host "データが不足しているため、出力をスキップします。"
    exit
}

# ConvertFrom-Csv で PowerShell オブジェクトに変換
$csvData = $lines | ConvertFrom-Csv

# すべて文字列化
$csvData = $csvData | ForEach-Object {
    $row = $_ | Select-Object *
    foreach ($prop in $row.PSObject.Properties) {
        $prop.Value = "$($prop.Value)"
    }
    $row
}

# Excelファイルに出力
$csvData | Export-Excel -Path $excelPath -WorksheetName "preview_100" -NumberFormat "@"

スポンサーリンク
タイトルとURLをコピーしました