Excelでクリップボードにコピーした情報は、Windows PowerShell
のGet-Clipboard
コマンドレットのFormat
オプションでImage
を指定するとImage
として取得できる事をしりました。
エクセルでコピー処理を行うと、クリップボードには書式情報等含めて引き渡される? ため、これがImage
に変換できるって話な気がします。
この動きについてちょっと確認してみます。
Get-ClipboardのFormatオプションはWindows PowerShellにしか存在しない
今回利用するGet-Clipboard
コマンドレットについては、PowerShellのバージョンが関係してきます。
Get-Clipboard
コマンドレットにFormat
オプションが用意されているのは、Windows PowerShell
のみとなり、クロスプラットフォームなPowerShell
にはFormat
オプションは用意されていません。
Feature Request: Restore -Format option in Get-Clipboard #12290
クロースプラットフォームなPowerShell
のGet-Clipboard
コマンドレットはあくまでプレンテキストな情報を取り扱うコマンドレットとなるようです。
Windows PowerShellで試してみる
上記のようにテーブルをCTRL - C
からクリップボードにコピーした状態で下記のコマンドを実行すると、画像イメージがc:\temp\excel.png
に保存されます。
$(Get-Clipboard -Format Image).Save("c:\temp\windows-poershell-excel.png")
Excelでコピー時にクリップボードに渡された情報を Clipboard.ContainsImage メソッド で確認してみると、True
と返却されるため。
Excelからクリップボードに引き渡される情報は、Imageに変換できる形式のもののようです。
# エクセルでコピーしたあとに下記のコマンドを実行するとTrueが返却される。
# ContainsImage()メソッドは Bitmap 形式のデータ、またはその形式に変換できるデータがクリップボードに存在するかどうかを示す
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.Clipboard]::ContainsImage()
【余談】PowerShell 7で実行したい場合
PowerShell 7 では、2023年2月現在。
Get-Clipboard
にFormat
オプションは実装されておらず、プレーンテキストのみを扱うようなコマンドレットとなっています。
このため、Excelでクリップボードに渡された情報をイメージとして出力するためにはGet-Clipboard
コマンドレットは利用できず。下記のように.NET
を利用することで出力できます。
$clip = $([System.Windows.Forms.Clipboard , System.Windows.Forms]::GetDataObject())
if ( $clip.ContainsImage() ) {
[System.Drawing.Bitmap]$clip.getimage().Save("c:\temp\excel.png", [System.Drawing.Imaging.ImageFormat]::Png)
}
そもそもExcelには図として保存がある
Excelだとそもそも`図としてコピー`という機能があります。
上記のようにテーブルを図としてコピー
すると、下記のような画像イメージをクリップボードにコピーする事ができます。
ExcelってImageに変換できる形式でなんか持ってるような気がします。
総評
Excelでクリップボードにコピーされる情報はImageに変換できるようです。
Excelにはそもそも図としてコピー
機能があるため、このような情報をスクリプトとして何か利用用途があるかといわれると微妙ですが。
Excel上でコピーした時に渡されるクリップボードのデータってこんな感じなんだって忘備録。