• 締切済み

PowershellでExcelへデータを書き込む

データを別途クリップボードにコピーしPowershellでExcelに書き込むことは下記の方法で出来ますが *コピー元の水平タブ区切りデータ 果物 りんご みかん バナナ 個数 12 25 15 *ペーストで書き込むるpsコード <# Excelを操作する為の宣言#> $excel = New-Object -ComObject Excel.Application <# 起動直後は非表示(最小化ではない)になっているので表示する#> $excel.Visible = $true <#新規ブックを作成する#> $book = $excel.Workbooks.Add() <#新規ブックを作成する#> $sheet = $excel.Worksheets.Item(1) <#B列にペーストする#> $sheet.Range("B2").PasteSpecial($exlpasteType::xlPasteValues) <#メモリを解放#> $excel = $null [GC]::Collect() これに対しデータのコピー等の作業を省き直接配列を使い処理できないかと思い下記のコードの方法まで至りました *配列で書き込むるpsコード <# Excelを操作する為の宣言#> $excel = New-Object -ComObject Excel.Application <# 起動直後は非表示(最小化ではない)になっているので表示する#> $excel.Visible = $true <#新規ブックを作成する#> $book = $excel.Workbooks.Add() <# シートを取得する#> $sheet = $excel.Worksheets.Item(1) <# セルへ配列で書き込み#> $arw = New-Object "object[,]" 2, 4 <# 書き込み用配列定義 2行4列#> $arw[0, 0] = "果物"; $arw[0, 1] = "りんご"; $arw[0, 2] = "みかん"; $arw[0, 3] = "バナナ" $arw[1, 0] = "個数"; $arw[1, 1] = 12; $arw[1, 2] = 25; $arw[1, 3] = 15 $sheet.Range("B2:E3") = $arw <# B2:E3 にセット#> <#メモリを解放#> $excel = $null [GC]::Collect() コピペで使うデータはsqlの集計結果をそのまま利用していますが、このコードの配列に書き直すにはちょっと手間が掛かる等の理由でもっとシンプル方法がないかと思い質問いたしました。 何か良い方法があればお教えください。

みんなの回答

  • UY-Scuti
  • ベストアンサー率85% (17/20)
回答No.1

$arw にセットするのに以下のような感じではどうでしょうか? 2行目のヒアドキュメントの @" ~"@に全角スペースか半角スペースで区切って、 果物 りんご みかん バナナ 個数 12 25 15 ようにすると、$arw にセットされると思います。 ---------------------------------------------- $str=@" 果物 りんご みかん バナナ 個数 12 25 15 "@ -split "`n" $c=($str[0] -split " | ").Count $r=$str.Count $arw=New-Object "object[,]" $r,$c $a=@() foreach($inc in 0..$r){ $cnt=0 $str[$inc] -split " | " | % { $a +="`$arw[$inc,$cnt]=`"$($_)`"" $cnt++ } } $a | iex 2>$null