M365関連 プログラム 技術

PowerShellでファイル読み込み(Excel)

Excelファイルを読み込んでみる

読み込むファイルの種類

今回、紹介するファイル読み込みは以下の拡張子が対象です
・Excelファイル(.xls / .xlsx / .xlsm)

前提条件

Word、Excel、PowerPointといったOfficeファイル形式を読み込む際は
実行環境に読み込み対象とするWord、Excel、PowerPointといったデスクトップアプリが
あらかじめインストールされており、ライセンス等の認証が完了している必要があります
今回紹介する方法がそのアプリの機能を使用しているためです

実際に読み込む

Excelファイルを開く

Excelに対して処理する際にExcelを表示しないで実行し
Excelの警告ウィンドウを表示しないおよびマクロを実行しないようにし
開く際にパスワードが必要な場合にパスワードを使用して開くようにしています
もし、パスワードがかかっていない場合はパスワードの値は無視して開くようになっています

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.EnableEvents = $false
$openPass = "Excelを開く際に使用するパスワード"
$book =  $excel.Workbooks.Open("Excelファイルパス",[type]::Missing,[type]::Missing,[type]::Missing,$openPass,$writePass)

Excelファイル内を読み込む

Excel内の各シートで設定されているハイパーリンクやシート内に記載されているテキスト、
図形に記載されているテキストを読み込んでいます
また、こちらで制御しないと際限なくセルを読み込み続けるので一定数セル内に
記述がなければスキップするようにしています

$maxRow = 100
$book.Worksheets | ForEach-Object {

    $_.Hyperlinks | ForEach-Object {
        Write-Host $_.Address
    }

    $_.Shapes | ForEach-Object {
        #グループの場合(msoGroupの値は6)
        if($_.Type -eq 6){
            $_.GroupItems | ForEach-Object{
                if($_.TextFrame2.HasText){
                    Write-Host $_.TextFrame2.TextRange.Text
                }
            }
        }else{
            if($_.TextFrame2.HasText){
                Write-Host $_.TextFrame2.TextRange.Text
            }
        }
    }
    
    $rowCnt = 0
    $_.UsedRange.Rows | ForEach-Object {
        $rowCnt += 1
        $_.Columns | ForEach-Object {
            if($_.Text -ne ""){
                Write-Host $_.Text
                $rowCnt = 0
            }
        }

        if($rowCnt -ge $maxRow){
            Write-Host これ以上記載がないと判断してスキップします
            break
        }
    }
}

開いたExcelを閉じる

開いたExcelを変更があった場合にも保存せずに閉じています
Closeで特に指定がない場合は変更を保存するかどうかのポップアップが表示されるので
必ずどちらかを指定した方がよさそうです
また、以下はExcelを読み込んだ後始末の決まった作法みたいなものになるのでそのまま使用してください。Excelを読み込むときに使用したメモリーを開放したり、Excelタスクを終了させたりしています

if($book){
    $book.Close($false)
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($book) | Out-Null
    $book = $null
    Remove-Variable -Name book -ErrorAction SilentlyContinue
}

[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
[System.GC]::Collect()

if($excel){
    $excel.Quit()
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
    $excel = $null
    Remove-Variable -Name excel -ErrorAction SilentlyContinue
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
    [System.GC]::Collect()
}

最後に

今回はExcel内の様々な箇所からのテキスト読み込みをしてみました
WordやPowerPointの読み込みも別の記事で紹介します
全体のコードはGitHubにアップしているので参考になれば

サンプル
BlogSampleCodeProjects/PowerShell_FileLoad/ExcelFileLoad.ps1 at main · nasuton/BlogSampleCodeProjects · GitHub
BlogSampleCodeProjects/PowerShell_FileLoad/ExcelFileLoad.ps1 at main · nasuton/BlogSampleCodeProjects · GitHub

Project for sample code used in the blog.(Blogで記載しているサンプルコード ...

続きを読む

-M365関連, プログラム, 技術
-,