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 "@"