コンピュータや音楽の事書いてます

配列を一括でExcelに書き込むとき、規則がたくさんある

Range型に代入でいっぺんに書き込める配列の条件:

  • 縦,横の要素数が1で始まっている
  • ジャグド配列ではなく、Object[,]型
  • .Range("A:H") とかだと遅くなるので、きっちり終わりの範囲を示す
  • 要素指定順は[row, column]

下記はlsコマンドの出力から各プロパティをシートに書き出す
苦労した点:

  • 複雑なオブジェクトがあってはならない?ので、"Parent","Root","Directory","Target"を除外した。日付型は大丈夫みたい
  • 少しでも規則に合わないことがあると原因とは無関係そうな感じのエラーをだす
    • 「プログラムの実行を続行するための十分なメモリがありませんでした。」
    • CategoryInfo : OperationStopped: (:) [], OutOfMemoryException
    • + FullyQualifiedErrorId : System.OutOfMemoryException
#実行条件:$sheetがWorksheet型であること
$list=(ls)
$props = $list | Get-Member | where MemberType -in CodeProperty,Property | where Name -notin "Parent","Root","Directory","Target" | select -Unique Name
[object[,]]$arr = [Array]::CreateInstance([Object], (($list.Length+1), $props.Length), (1,1))
$c = 1; foreach($p in $props){
	$arr[1,$c]=$p.Name
	$c++
}
$r = 2; foreach($f in $list){
	$c = 1; foreach($p in $props){
		$arr[$r,$c]=$f.($p.Name)
		$c++
	}
	$r++
}
$a1 = $sheet.Range("a1")
$sheet.Range($a1, $a1.Offset($list.Length,$props.Length-1)) = $arr

まあ、こんなことしなくても
ls | Export-Csv a.csv
で一発なんだけど、、、配列一括代入の方法を確認したかったので。