はじめに
Excelに記載した表のデータをテキストファイルに出力する処理をPowerShellで実装してみたいと思います。
経緯
EXCEL形式の「ディレクトリ・ファイル設計書」なるものと、実際のファイルを比較してファイルの過不足チェックを行いたい。
「ディレクトリ・ファイル設計書」のフォーマット例は以下の通り。
設計書・実ファイルともに、フルパスファイル名を改行区切りでテキストファイルに吐き出し、Diffを取ってファイルの過不足チェックを行うこととします。
そこで、PowerShellで「Excelの内容をテキストファイルに出力する」を実装します。
スクリプト
ソースコード
fileListFromExcel.ps1
# fileListFromExcel.ps1
# fileList.xlsxから.txtファイルを作成する
#
# 【抽出条件】
# -/d/l/c/b = -
# 【実行例】
# powershell -NoProfile -ExecutionPolicy Unrestricted .\fileListFromExcel.ps1 .\fileList.xlsx
param($targetFile)
# ISEでの実行用に引数がない場合に初期値を設定する
if($targetFile -eq $null){ $targetFile = '.\fileList.xlsx' } # 適宜コメントアウト
# 出力するファイル一覧のファイル名
$OutFile = ".\fileListFromExcel.txt"
# パラメタチェック
if ($targetFile -eq $null) {
Write-Host "引数が足りません。(引数1:フルパスのfileList.xlsx)処理を中止します。"
exit 1
}
# Excelファイルの存在チェック
if (!(Test-Path $targetFile)) {
Write-Host "ファイルが存在しません。処理を中止します。"
exit 1
}
$FileList = @();
try {
$file = (Get-ChildItem $targetFile).FullName
$excel = New-Object -ComObject Excel.Application # Excelを起動
$excel.Visible = $false # Excelを非表示にする
$book = $excel.Workbooks.Open($file) # 対象のExcelファイルを開く
$sheet = $excel.Worksheets.Item("fileList") # 「fileList」シートを選択
# $sheet = $excel.Worksheets.Item(1) # または、1番目のシートを選択
$line = 2 # ヘッダ行を飛ばして2行目からスタート
$resultCount = 0
Write-Host ('---EXCELファイル読み込み中---')
while ($true) {
$Type = $sheet.Cells.Item($line,2).Text
$dir = $sheet.Cells.Item($line,3).Text
$file = $sheet.Cells.Item($line,4).Text
if ($Type -eq "") { break } # 空のセルを見つけたらそこで終了
# 抽出条件
if($Type -eq "-") {
$FileList += "$dir" + "/" + "$file"
$resultCount++
}
$line++
}
Write-Host ('---EXCELファイル読み込み完了---')
$line = $line - 1
Write-Host (' Excelの' + $line + '行目まで読み込みました')
Write-Host (' 出力対象データは' + $resultCount + '件です')
Write-Host ('---ソート中---')
$FileList = $FileList | Sort-Object
Write-Host ('---ソート完了---')
Write-Host ('---ファイル出力中')
Out-File -InputObject $FileList -FilePath $OutFile -Encoding default
Write-Host ('---ファイル出力完了---')
} catch [Exception] {
$exp = $error[0].ToString()
Write-Host ($exp)
} finally {
$excel.Quit() # Excelを閉じる
$excel,$book,$sheet | foreach{$_ = $null} # null破棄
}
処理の流れ
New-Object
でExcelを起動する- Book、Sheetを開く
- 表を上から順に読み、ファイルタイプ=”-“(ファイル)のデータを配列に格納する
Sort-Object
で配列を昇順に並び替えるOut-File
でテキストファイルに出力
実行方法
Windowsコマンドプロンプトで以下のコマンドを実行します。
powershell -NoProfile -ExecutionPolicy Unrestricted .\fileListFromExcel.ps1 .\fileList.xlsx
参考情報
以下を参考にさせていただきました。
コメント