雑記+備忘録

OS中心の技術情報と趣味について(最近は主に将棋)。備忘録なのでここに書かれたことを試すのは自己責任でお願いします。

csvデータを取り込んでExcelで折れ線グラフを生成するPowerShell

PowerShellで以下を実現する文の紹介としてサンプルプログラムを作成しました。
Excelのセルに値を入れる
Excelのグラフ(折れ線グラフ)を作成
PowerShellExcelを扱う際の「Cells」の使い方

# 
# csvからExcelでグラフを生成するPowerShell
# 
########## 値を変更する変数 ##########

# Excelファイル名
$fileName = "Test.xlsx"

# Excelシート名
$sheetName = "Test"

## 情報CSVファイル名
$csvFName = "Test.csv"

######################################


# ファイルのパスを取得
$scriptPF = $MyInvocation.MyCommand.Path
$scriptPath = Split-Path -Parent $scriptPF

$flExcelPF = $scriptPath + "\" + $fileName

# Excelファイルが存在する場合に処理
if (Test-Path $flExcelPF) {

  # Excelのオープン
  $objExcelAp = New-Object -ComObject Excel.Application
  $objExcelAp.Visible = $true

  $objExcelBook = $objExcelAp.Workbooks.Open($flExcelPF)

  $objExcelSheet = $objExcelBook.Worksheets.Item($sheetName)

  # データを取り込み、編集
  ## CSVファイル読み込み
  $headerStr = "ddf01,ddf02,ddf03,ddf04,ddf05"
  $headerSplit = $headerStr -split ","
  $csvObj = Get-Content $csvFName | ConvertFrom-Csv -Header $headerSplit

  ## 初期値、先頭行設定
  $nCount = 1
  $objExcelSheet.Cells.Item(2, 1) = "No."
  $objExcelSheet.Cells.Item(2, 2) = "Score"

  ## CSV1件ごとに処理
  $csvObj | ForEach-Object {

    ## データ編集
    $objExcelSheet.Cells.Item(2 + $nCount, 1) = $nCount
    $objExcelSheet.Cells.Item(2 + $nCount, 2) = $_.ddf03

    $nCount++

  }

  # データをグラフ化
  $strRange = "A2:B" + (1 + $nCount)
  $dataRange = $objExcelSheet.Range($strRange)

  $chartObjects = $objExcelSheet.ChartObjects()

  $newChartObject = $chartObjects.Add(120, 10, 700, 300)

  $MyChart = $newChartObject.Chart
  $MyChart.ChartType = 4
  $MyChart.SetSourceData($dataRange)
  $MySeries = $MyChart.SeriesCollection(1)
  $MySeries.Delete() | Out-Null

  # ファイルの保存、閉じてExcelの終了
  $objExcelBook.Save()

  $objExcelAp.Quit()

  # プロセスの解放
  .{
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($MyChart)
     $MyChart = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($newChartObject)
     $newChartObject = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($chartObjects)
     $chartObjects = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcelSheet)
     $objExcelSheet = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcelBook)
     $objExcelBook = $null
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcelAp)
     $objExcelAp = $null
   } | Out-Null

  # ガベージコレクトの明示実行
  [GC]::Collect()
  [GC]::WaitForPendingFinalizers()
  [GC]::Collect()

}

csvファイルの項目名「ddf01~ddf05」は、現行システム(個人的に趣味で作成した)のデータが5つ項目を持っていて、
3番目の「点数」をグラフ化したかったのでこのような構成になっています。
横軸もただのナンバリングです。

ChartType = 4については以下のURLを参考に設定しています。(ありがとうございます)
http://officetanaka.net/excel/vba/graph/06.htm

PowerShellで折れ線グラフ生成」は元々他のフリーで公開されているツールと組み合わせて実現していたのですが、
パソコンを買い替えたときにそのツールを再設定するのが面倒になって、
自分のパソコンライフスタイル上ほぼ確実に入れることになるExcelでやる方針にしました。