2017-05-26 14 views
2

EPPlusを使用してプロパティ値に基づいて範囲内のすべてのセルを検索したいとします。既存のスプレッドシートに太字のテキストを含むすべてのセルを見つける必要があるとします。私は、設定可能なプロパティのパラメータを受け入れる関数を作成する必要がありますが、私は変数に格納されたプロパティを使用して問題がないよ:これらの作業のPowershell:変数に格納されるプロパティ

$cellobject = $ws.cells[1,1,10,10] 
$properties = 'Style.Font.Bold' 

$cellobject.$properties 
$cellobject.{$properties} 
$cellobject.($properties) 
$cellobject."$properties" 

なしに、コール深度のオーバーフローを引き起こします。

この方法ではうまくいかない場合、私は使用できるライブラリに何かがありますか?

編集:私はHanShotFirstが提供する概念と機能を更新し、最終的な解決策を表示するには...

function Get-CellObject($ExcelSheet,[string]$PropertyString,[regex]$Value){ 

    #First you have to get the last row with text, 
    #solution for that is not provided here... 
    $Row = Get-LastUsedRow -ExcelSheet $ExcelSheet -Dimension $true 

    while($Row -gt 0){ 
     $range = $ExcelSheet.Cells[$Row, 1, $Row, $ExcelSheet.Dimension.End.Column] 

     foreach($cellObject in $range){ 

      if($PropertyString -like '*.*'){ 
       $PropertyArr = $PropertyString.Split('.') 
       $thisObject = $cellObject 

       foreach($Property in $PropertyArr){ 
        $thisObject = $thisObject.$Property 

        if($thisObject -match $Value){ 
         $cellObject 
        } 
       } 
      } 
      else{ 
       if($cellObject.$PropertyString -match $Value){ 
        $cellObject 
       } 
      } 
     } 
     $Row-- 
    } 
} 
#The ExcelSheet parameter takes a worksheet object 
Get-CellObject -ExcelSheet $ws -Property 'Style.Font.Bold' -Value 'True' 
+0

あなたは '$のcellobject.properties'を試してみましたが、次のとおりです。これは、同じ結果を生成する必要がありますか? – Moerwald

+0

@Moerwaldはい、私は試しました。しかし、ポイントは、プロパティをプロパティ内で設定可能にすることです。そのため、変数にプロパティを格納する必要があります。それは理にかなっていますか? – Mack

+0

問題は文字列$ propertiesのピリオドのようです。 – Mack

答えて

3

ドットプロパティに歩くことは本当に文字列では動作しません。プロパティのレイヤーを分割する必要があります。ここでは、3つのプロパティのレイヤを持つオブジェクトの例を示します。あなたの例では

# create object 
$props = @{ 
    first = @{ 
     second = @{ 
      third = 'test' 
     } 
    } 
} 
$obj = New-Object -TypeName psobject -Property $props 

# outputs "test" 
$obj.first.second.third 

# does not work 
$obj.'first.second.third' 

# outputs "test" 
$a = 'first' 
$b = 'second' 
$c = 'third' 
$obj.$a.$b.$c 

これは、このようなものになるだろう:

$cellobject = $ws.cells[1,1,10,10] 
$p1 = 'Style' 
$p2 = 'Font' 
$p3 = 'Bold' 

$cellobject.$p1.$p2.$p3 

それとも、それを少し動的に行うことができます。

$cellobject = $ws.cells[1,1,10,10]  
$props = 'Style.Font.Bold'.Split('.') 
$result = $cellobject 
foreach ($prop in $props) { 
    $result = $result.$prop 
} 
$result 

とその金曜日以来

、ここではそのための機能:)

function GetValue { 
    param (
     [psobject]$InputObject, 
     [string]$PropertyString 
    ) 

    if ($PropertyString -like '*.*') { 
     $props = $PropertyString.Split('.') 
     $result = $InputObject 
     foreach ($prop in $props) { 
      $result = $result.$prop 
     } 
    } else { 
     $result = $InputObject.$PropertyString 
    } 

    $result 
} 

# then call the function 
GetValue -InputObject $cellobject -PropertyString 'Style.Font.Bold' 
+0

お返事ありがとうございます。あなたはその関数の例を挙げますか?問題は '$ cellobject'のセル番号がループ内で自動的に計算され、プロパティとしてパラメータを追加して正しいオブジェクトを返す必要があったことです。それは理にかなっていますか? 3つのプロパティすべてを1つにする方法がないと言っていますが、これは正しいですか? – Mack

+0

おっと、私はちょうどあなたが答えを編集したのを見ました。 – Mack

+0

関数を含む別の例を追加しました。 – HanShotFirst

関連する問題