我想从Powershell中更改Excel中的数据。

时间:2018-07-11 20:52:45

标签: excel powershell

我需要找到数据在哪一行,然后将其复制以及下面的所有其他行,并将其移至工作表的顶部。剪切和粘贴是可行的,但是我似乎找不到能够让我选择所需所有行的函数。

到目前为止,我已经尝试过了。

$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open('C:\Users\xx\Test2\TestFile2.xlsx')
$Worksheet = $Workbook.Sheets.Item(1)
$worksheet.Activate()
$Found = $Worksheet.Cells.Find('Last Name')
[char] $col = $found.column + 64
[String] $value = $col + $found.row
$range = $worsheet.Range("$value :A4")

但是我明白了

You cannot call a method on a null-valued expression.
At line:1 char:1
+ $range = $worsheet.Range("$value :A4")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
     + FullyQualifiedErrorId : InvokeMethodOnNull

对于Powershell来说我还很陌生,因此可以提供任何帮助

谢谢!

1 个答案:

答案 0 :(得分:1)

我强烈建议对此操作使用ImportExcel module,以便您可以直接在PowerShell中操作对象。假设我们有一个这样的表:

+----------+---------+
| Column1  | Column2 |
+----------+---------+
| Value1   | a       |
| Value2   | b       |
| LastName | c       |
| Value3   | d       |
| Value4   | e       |
+----------+---------+

我们可以做的是将其导入PowerShell对象,然后找到要查找的值(在我的情况下为Column1 -eq 'LastName'):

$data = Import-Excel .\Book1.xlsx

$i = 0
$data | % {if ($_.Column1 -eq "LastName"){
    $i
    break
  }
  else {
    $i++
  }
}

然后,我们必须将所有从顶部开始的行保存到一个变量,并将从刚发现的行开始的行保存到另一个变量:

$above = @()
$thisAndBelow = @()
for ($j = 0; $j -lt $data.length; $j++) {
  if ($j -lt $i) {$above += $data[$j]}
  else {$thisAndBelow += $data[$j]
  }
}

然后将它们放在一起并导出到输出文件:

$object = $thisAndBelow + $above
$object | Export-Excel .\Book2.xlsx

如预期的那样,输出为:

+----------+---------+
| Column1  | Column2 |
+----------+---------+
| LastName | c       |
| Value3   | d       |
| Value4   | e       |
| Value1   | a       |
| Value2   | b       |
+----------+---------+