[PowerShell]Excelの内容をテキストファイルに出力する

はじめに

Excelに記載した表のデータをテキストファイルに出力する処理PowerShellで実装してみたいと思います。

経緯

EXCEL形式の「ディレクトリ・ファイル設計書」なるものと、実際のファイルを比較してファイルの過不足チェックを行いたい。

ディレクトリ・ファイル設計書」のフォーマット例は以下の通り。

ファイルタイプ
  • – : 普通のファイル(Regular File)
  • d : ディレクトリ
  • l : シンボリックリンク
  • c : キャラクタ型デバイスファイル(特殊ファイル)
  • b : ブロック型デバイスファイル(特殊ファイル)

設計書・実ファイルともに、フルパスファイル名を改行区切りでテキストファイルに吐き出し、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破棄
}

処理の流れ

  1. New-ObjectでExcelを起動する
  2. Book、Sheetを開く
  3. 表を上から順に読み、ファイルタイプ=”-“(ファイル)のデータを配列に格納する
  4. Sort-Objectで配列を昇順に並び替える
  5. Out-Fileでテキストファイルに出力

実行方法

Windowsコマンドプロンプトで以下のコマンドを実行します。

powershell -NoProfile -ExecutionPolicy Unrestricted .\fileListFromExcel.ps1 .\fileList.xlsx

参考情報

以下を参考にさせていただきました。

コメント

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