Go to list of users who liked
Share on X(Twitter)
Share on Facebook
[備忘録] PowerShellでExcelのようなグリッド画面を作成してみた
はじめに
PowerShellでデータを扱う際、コンソールでの表示だけでは見づらいことがあります。そこで、Excelのようなグリッド形式でデータを表示・編集できる画面を作成する方法を備忘録として残します。
想定するユースケースの例
ファイルから特定の情報を即席で抽出して確認したい場面――たとえばコピー直後などに使えそうだと思い、この記事の実装を試してみました。
ログ解析や、LLMの出力データから特定の情報を頻繁に抜き出したいときにも便利です。
ツールのインストールが難しい環境でも、PowerShellが使える場合には有効な手段になりそうです。
動作確認環境
- OS: Windows 11
- PowerShell: 5.1
- .NET Framework(Windows 標準搭載)
補足: PowerShell 7 でも
Microsoft.PowerShell.GraphicalToolsをインストールすれば
動作する見込みがありますが、筆者環境では未検証です。
Out-GridViewコマンドレット
PowerShellには標準でOut-GridViewというコマンドレットが用意されており、簡単にグリッド表示を実現できます。
基本的な使い方
# プロセス一覧をグリッド表示Get-Process|Out-GridViewフィルタリング機能付きグリッド
# サービス一覧を表示(フィルタリング可能)Get-Service|Out-GridView-Title"サービス一覧"選択結果を変数に格納
# 複数選択可能なグリッドから選択したアイテムを取得$selectedItems=Get-Process|Out-GridView-PassThru-Title"プロセスを選択してください"$selectedItems|ForEach-Object{Write-Host"選択されたプロセス:$($_.Name)"}Windows Formsを使用したカスタムグリッド
より高度なカスタマイズが必要な場合は、Windows FormsのDataGridViewを使用します。
基本的なDataGridViewの実装
Add-Type-AssemblyNameSystem.Windows.FormsAdd-Type-AssemblyNameSystem.Drawing# フォームの作成$form=New-ObjectSystem.Windows.Forms.Form$form.Text="PowerShell データグリッド"$form.Size=New-ObjectSystem.Drawing.Size(800,600)$form.StartPosition="CenterScreen"# DataGridViewの作成$dataGridView=New-ObjectSystem.Windows.Forms.DataGridView$dataGridView.Size=New-ObjectSystem.Drawing.Size(760,520)$dataGridView.Location=New-ObjectSystem.Drawing.Point(20,20)$dataGridView.AutoSizeColumnsMode="Fill"# データの準備$data=@([PSCustomObject]@{ID=1;名前="田中太郎";部署="営業部";年齢=28}[PSCustomObject]@{ID=2;名前="鈴木花子";部署="開発部";年齢=32}[PSCustomObject]@{ID=3;名前="佐藤次郎";部署="総務部";年齢=45})# データをDataGridViewにバインド$dataGridView.DataSource=[System.Collections.ArrayList]$data# フォームにDataGridViewを追加$form.Controls.Add($dataGridView)# フォームを表示$form.ShowDialog()CSVファイルの読み込みと表示
# まず、サンプルデータをCSVファイルとして保存$sampleData=@([PSCustomObject]@{ID=1;名前="田中太郎";部署="営業部";年齢=28}[PSCustomObject]@{ID=2;名前="鈴木花子";部署="開発部";年齢=32}[PSCustomObject]@{ID=3;名前="佐藤次郎";部署="総務部";年齢=45})# CSVファイルとして保存$csvPath="$env:TEMP\employee_data.csv"$sampleData|Export-Csv-Path$csvPath-NoTypeInformation-EncodingUTF8Write-Host"サンプルCSVファイルを作成しました:$csvPath"# CSVファイルを読み込んでグリッド表示する関数functionShow-CSVInGrid{param([string]$FilePath)Add-Type-AssemblyNameSystem.Windows.FormsAdd-Type-AssemblyNameSystem.Drawing# CSVデータの読み込み$csvData=Import-Csv-Path$FilePath-EncodingUTF8# フォームの作成$form=New-ObjectSystem.Windows.Forms.Form$form.Text="CSV Viewer -$(Split-Path$FilePath-Leaf)"$form.Size=New-ObjectSystem.Drawing.Size(800,600)$form.StartPosition="CenterScreen"# DataGridViewの作成$dataGridView=New-ObjectSystem.Windows.Forms.DataGridView$dataGridView.Size=New-ObjectSystem.Drawing.Size(760,520)$dataGridView.Location=New-ObjectSystem.Drawing.Point(20,20)$dataGridView.AutoSizeColumnsMode="Fill"$dataGridView.AllowUserToAddRows=$false# データテーブルの作成$dataTable=New-ObjectSystem.Data.DataTable# カラムの追加$csvData[0].PSObject.Properties|ForEach-Object{$dataTable.Columns.Add($_.Name)|Out-Null}# データの追加foreach($rowin$csvData){$dataRow=$dataTable.NewRow()$row.PSObject.Properties|ForEach-Object{$dataRow[$_.Name]=$_.Value}$dataTable.Rows.Add($dataRow)}# DataGridViewにデータをバインド$dataGridView.DataSource=$dataTable# スタイル設定$dataGridView.AlternatingRowsDefaultCellStyle.BackColor=[System.Drawing.Color]::LightGray$dataGridView.ColumnHeadersDefaultCellStyle.Font=New-ObjectSystem.Drawing.Font("MS UI Gothic",10,[System.Drawing.FontStyle]::Bold)# フォームにDataGridViewを追加$form.Controls.Add($dataGridView)# フォームを表示$form.ShowDialog()}# 作成したCSVファイルを表示Show-CSVInGrid-FilePath$csvPath編集可能なグリッドとデータの保存
functionShow-EditableGrid{Add-Type-AssemblyNameSystem.Windows.FormsAdd-Type-AssemblyNameSystem.Drawing# フォームの作成$form=New-ObjectSystem.Windows.Forms.Form$form.Text="編集可能なデータグリッド"$form.Size=New-ObjectSystem.Drawing.Size(900,650)$form.StartPosition="CenterScreen"# DataGridViewの作成$dataGridView=New-ObjectSystem.Windows.Forms.DataGridView$dataGridView.Size=New-ObjectSystem.Drawing.Size(860,550)$dataGridView.Location=New-ObjectSystem.Drawing.Point(20,20)$dataGridView.AutoSizeColumnsMode="Fill"$dataGridView.AllowUserToAddRows=$true$dataGridView.AllowUserToDeleteRows=$true# 初期データ$script:dataList=[System.Collections.ArrayList]@([PSCustomObject]@{商品名="ノートPC";価格=98000;在庫=15}[PSCustomObject]@{商品名="マウス";価格=2500;在庫=50}[PSCustomObject]@{商品名="キーボード";価格=8000;在庫=30})$dataGridView.DataSource=$script:dataList# 保存ボタン$saveButton=New-ObjectSystem.Windows.Forms.Button$saveButton.Text="CSVに保存"$saveButton.Size=New-ObjectSystem.Drawing.Size(100,30)$saveButton.Location=New-ObjectSystem.Drawing.Point(780,580)$saveButton.Add_Click({$saveDialog=New-ObjectSystem.Windows.Forms.SaveFileDialog$saveDialog.Filter="CSV files (*.csv)|*.csv|All files (*.*)|*.*"$saveDialog.DefaultExt="csv"if($saveDialog.ShowDialog()-eq"OK"){$script:dataList|Export-Csv-Path$saveDialog.FileName-NoTypeInformation-EncodingUTF8[System.Windows.Forms.MessageBox]::Show("保存しました","情報")}})# コントロールをフォームに追加$form.Controls.Add($dataGridView)$form.Controls.Add($saveButton)# フォームを表示$form.ShowDialog()}# 実行Show-EditableGrid保存ボタンで出力できる
WPFを使用したモダンなグリッド
より洗練されたUIが必要な場合は、WPFのDataGridを使用します。
Add-Type-AssemblyNamePresentationFrameworkAdd-Type-AssemblyNamePresentationCoreAdd-Type-AssemblyNameWindowsBase[xml]$xaml=@"<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF データグリッド" Height="600" Width="900"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="50"/> </Grid.RowDefinitions> <DataGrid Name="dataGrid" Grid.Row="0" Margin="10" AutoGenerateColumns="True" CanUserAddRows="True" CanUserDeleteRows="True" GridLinesVisibility="All" AlternatingRowBackground="#F0F0F0"/> <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="10"> <Button Name="loadButton" Content="データ読込" Width="100" Margin="5"/> <Button Name="saveButton" Content="保存" Width="100" Margin="5"/> </StackPanel> </Grid></Window>"@$reader=(New-ObjectSystem.Xml.XmlNodeReader$xaml)$window=[Windows.Markup.XamlReader]::Load($reader)# コントロールの取得$dataGrid=$window.FindName("dataGrid")$loadButton=$window.FindName("loadButton")$saveButton=$window.FindName("saveButton")# サンプルデータ$employees=@([PSCustomObject]@{社員ID="E001";氏名="山田太郎";部署="営業部";入社年=2018}[PSCustomObject]@{社員ID="E002";氏名="田中花子";部署="開発部";入社年=2020}[PSCustomObject]@{社員ID="E003";氏名="佐藤健";部署="人事部";入社年=2015})$dataGrid.ItemsSource=$employees# イベントハンドラ$loadButton.Add_Click({[System.Windows.MessageBox]::Show("データ読込機能を実装してください","情報")})$saveButton.Add_Click({[System.Windows.MessageBox]::Show("保存機能を実装してください","情報")})$window.ShowDialog()実用的な Tips(簡易まとめ)
参考情報からの備忘録で自分では未検証です。興味ありましたら関係ありそうな参考情報を参照ください。
大量データを高速表示
- WinForms
DataGridViewではVirtualMode = $true+CellValueNeeded実装で桁違いに軽く
- WinForms
カラムカスタマイズ
- 読み取り専用:
$dg.Columns["ID"].ReadOnly = $true - 自動幅調整:
$dg.AutoResizeColumns()
- 読み取り専用:
セル書式・色分け
- 通貨書式:
$dg.Columns["価格"].DefaultCellStyle.Format = "C0" - 条件付き色付け (在庫 < 10):
CellFormattingイベントでBackColor = LightPink
- 通貨書式:
クリップボード連携
Get-Clipboard|ConvertFrom-Csv|Out-GridView-Title"Clipboard CSV"ビューアとして待機 (-Wait)
Get-EventLog-LogNameSystem-Newest500|Out-GridView-Title"最新 500 件の System ログ"-WaitGUI が使えない環境の代替
Format-Table | moreでページング表示- VS Code PowerShell Notebook のテーブル表示も有効
まとめ
PowerShellでExcelのようなグリッド画面を作成する方法をいくつか紹介しました。
- Out-GridView: 最も簡単で、基本的な表示・フィルタリングには十分
- Windows Forms: より細かいカスタマイズが可能で、編集機能も実装しやすい
- WPF: モダンなUIを実現でき、データバインディングが強力
用途に応じて適切な方法を選択することで、PowerShellでも使いやすいデータ管理ツールを作成できます。
参考リンク
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme










